From 3e166f87473f2d8256eabc3847213af3ff404ea2 Mon Sep 17 00:00:00 2001 From: baxiry Date: Sun, 23 Jun 2024 01:24:58 +0300 Subject: [PATCH] improve matching performence --- README.md | 4 ++-- engine/filter.go | 10 +++++----- engine/queries.go | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 568635e..a5b46f2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -**ZaraDB:** A Lightweight and Fast Document Database +**ZaraDB:** A Lightweight fast document database -ZaraDB is a lightweight, fast, open-licensed document database with no hidden restrictions. +ZaraDB is a lightweight fast open-licensed document database with no hidden restrictions. Its goal is to be a lightweight alternative to common documentary databases. It can also provide superior performance compared to Mongo in many common use cases. diff --git a/engine/filter.go b/engine/filter.go index 2302c21..c49732b 100644 --- a/engine/filter.go +++ b/engine/filter.go @@ -10,12 +10,12 @@ import ( // json:5, array:5, int:2, string:3 // match verifies that data matches the conditions -func match(filter, data string) (result bool, err error) { +func match(filter gjson.Result, data string) (result bool, err error) { // TODO should return syntax error if op unknown result = true - gjson.Parse(filter).ForEach(func(qk, qv gjson.Result) bool { + filter.ForEach(func(qk, qv gjson.Result) bool { dv := gjson.Get(data, qk.String()) @@ -136,7 +136,7 @@ func match(filter, data string) (result bool, err error) { if qk.Str == "$and" { for _, v := range qv.Array() { - res, _ := match(v.String(), data) + res, _ := match(v, data) if !res { result = false return result @@ -149,7 +149,7 @@ func match(filter, data string) (result bool, err error) { for _, v := range qv.Array() { - res, _ := match(v.String(), data) + res, _ := match(v, data) if res { return result } @@ -164,7 +164,7 @@ func match(filter, data string) (result bool, err error) { } }) - match(qv.String(), dv.String()) + match(qv, dv.String()) return result } diff --git a/engine/queries.go b/engine/queries.go index fe991c4..d4f4916 100644 --- a/engine/queries.go +++ b/engine/queries.go @@ -15,7 +15,7 @@ type matched struct { // deletes Many items func (db *DB) deleteMany(query string) string { - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") coll := gjson.Get(query, "collection").String() @@ -64,7 +64,7 @@ func (db *DB) deleteMany(query string) string { // TODO updateMany update document data func (db *DB) updateMany(query string) (result string) { - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") newObj := gjson.Get(query, "data").String() @@ -121,7 +121,7 @@ func (db *DB) updateMany(query string) (result string) { // TODO updateOne one update document data func (db *DB) updateOne(query string) (result string) { - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") newObj := gjson.Get(query, "data").String() @@ -199,10 +199,10 @@ func (db *DB) findMany(query string) (res string) { return `{"error":"forgot collection name "}` } - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") + + if mtch.String() == "" { - if mtch == "" { - mtch = "{}" } skip := gjson.Get(query, "skip").Int() @@ -271,7 +271,7 @@ func (db *DB) findMany(query string) (res string) { func (db *DB) findOne(query string) (res string) { coll := gjson.Get(query, "collection").String() - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") skip := gjson.Get(query, "skip").Int() // TODO are skyp useful here ? @@ -311,7 +311,7 @@ func (db *DB) findOne(query string) (res string) { func (db *DB) deleteOne(query string) string { coll := gjson.Get(query, "collection").String() - mtch := gjson.Get(query, "match").String() + mtch := gjson.Get(query, "match") stmt := `select rowid, record from ` + coll