From f44dce2d827c93e444abdf6b9ef80a87fc4c871a Mon Sep 17 00:00:00 2001 From: baxiry Date: Sun, 23 Jun 2024 03:15:20 +0300 Subject: [PATCH] improve performece --- engine/actions.go | 31 ++++++++--------- engine/queries.go | 77 +++++++++++++++++++++---------------------- engine/store.go | 6 ++-- engine/transaction.go | 6 ++-- static/shell.html | 8 +++-- 5 files changed, 65 insertions(+), 63 deletions(-) diff --git a/engine/actions.go b/engine/actions.go index b8aaa8b..04403e5 100644 --- a/engine/actions.go +++ b/engine/actions.go @@ -6,52 +6,53 @@ import ( // ok func HandleQueries(query string) string { - switch gjson.Get(query, "action").String() { + parsedQuery := gjson.Parse(query) + switch parsedQuery.Get("action").String() { // database actions case "findOne": - return db.findOne(query) + return db.findOne(parsedQuery) case "findMany": - return db.findMany(query) + return db.findMany(parsedQuery) case "findById": - return db.findById(query) + return db.findById(parsedQuery) case "insert": - return db.insertOne(query) + return db.insertOne(parsedQuery) case "insertMany": - return db.insertMany(query) + return db.insertMany(parsedQuery) // update case "updateById": - return db.updateById(query) + return db.updateById(parsedQuery) case "updateOne": - return db.updateOne(query) + return db.updateOne(parsedQuery) case "updateMany": - return db.updateMany(query) + return db.updateMany(parsedQuery) case "deleteById": - return db.deleteById(query) + return db.deleteById(parsedQuery) case "deleteOne": - return db.deleteOne(query) + return db.deleteOne(parsedQuery) case "deleteMany": - return db.deleteMany(query) + return db.deleteMany(parsedQuery) case "transaction": - return transaction(query) + return transaction(parsedQuery) // manage database case "create_collection": - return createCollection(query) + return createCollection(parsedQuery.Get("collection").String()) case "delete_collection": - return deleteCollection(query) + return deleteCollection(parsedQuery.Get("collection").String()) case "show_collection": //return showCollections(db.path) diff --git a/engine/queries.go b/engine/queries.go index d4f4916..80252cb 100644 --- a/engine/queries.go +++ b/engine/queries.go @@ -13,11 +13,11 @@ type matched struct { } // deletes Many items -func (db *DB) deleteMany(query string) string { +func (db *DB) deleteMany(query gjson.Result) string { - mtch := gjson.Get(query, "match") + mtch := query.Get("match") - coll := gjson.Get(query, "collection").String() + coll := query.Get("collection").String() stmt := `select rowid, record from ` + coll @@ -62,13 +62,13 @@ func (db *DB) deleteMany(query string) string { } // TODO updateMany update document data -func (db *DB) updateMany(query string) (result string) { +func (db *DB) updateMany(query gjson.Result) (result string) { - mtch := gjson.Get(query, "match") + mtch := query.Get("match") - newObj := gjson.Get(query, "data").String() + newObj := query.Get("data").String() - coll := gjson.Get(query, "collection").String() + coll := query.Get("collection").String() // updates exist value @@ -119,13 +119,13 @@ func (db *DB) updateMany(query string) (result string) { } // TODO updateOne one update document data -func (db *DB) updateOne(query string) (result string) { +func (db *DB) updateOne(query gjson.Result) (result string) { - mtch := gjson.Get(query, "match") + mtch := query.Get("match") - newObj := gjson.Get(query, "data").String() + newObj := query.Get("data").String() - coll := gjson.Get(query, "collection").String() + coll := query.Get("collection").String() // updates exist value @@ -169,12 +169,13 @@ func (db *DB) updateOne(query string) (result string) { } // Update update document data -func (db *DB) updateById(query string) (result string) { +func (db *DB) updateById(query gjson.Result) (result string) { + oldObj := db.findById(query) - id := gjson.Get(query, "_id").String() - newObj := gjson.Get(query, "data").String() - coll := gjson.Get(query, "collection").String() + id := query.Get("_id").String() + newObj := query.Get("data").String() + coll := query.Get("collection").String() newData := gjson.Get(`[`+oldObj+`,`+newObj+`]`, `@join`).Raw @@ -191,22 +192,22 @@ func (db *DB) updateById(query string) (result string) { } // Find finds any obs match creteria. -func (db *DB) findMany(query string) (res string) { +func (db *DB) findMany(query gjson.Result) (res string) { // TODO parse hol qury one time - coll := gjson.Get(query, "collection").String() + coll := query.Get("collection").String() if coll == "" { return `{"error":"forgot collection name "}` } - mtch := gjson.Get(query, "match") + mtch := query.Get("match") if mtch.String() == "" { } - skip := gjson.Get(query, "skip").Int() - limit := gjson.Get(query, "limit").Int() + skip := query.Get("skip").Int() + limit := query.Get("limit").Int() if limit == 0 { limit = 100 // what is default setting ? } @@ -251,7 +252,7 @@ func (db *DB) findMany(query string) (res string) { // TODO aggrigate here // remove|rename some fields - flds := gjson.Get(query, "fields") + flds := query.Get("fields") listData = fields(listData, flds) records := "[" @@ -268,11 +269,9 @@ func (db *DB) findMany(query string) (res string) { } // Finds first obj match creteria. -func (db *DB) findOne(query string) (res string) { - coll := gjson.Get(query, "collection").String() - - mtch := gjson.Get(query, "match") - skip := gjson.Get(query, "skip").Int() +func (db *DB) findOne(query gjson.Result) (res string) { + coll := query.Get("collection").String() + skip := query.Get("skip").Int() // TODO are skyp useful here ? @@ -284,6 +283,7 @@ func (db *DB) findOne(query string) (res string) { } defer rows.Close() + mtch := query.Get("match") record := "" for rows.Next() { if skip != 0 { @@ -308,10 +308,9 @@ func (db *DB) findOne(query string) (res string) { } // delete -func (db *DB) deleteOne(query string) string { +func (db *DB) deleteOne(query gjson.Result) string { - coll := gjson.Get(query, "collection").String() - mtch := gjson.Get(query, "match") + coll := query.Get("collection").String() stmt := `select rowid, record from ` + coll @@ -322,7 +321,7 @@ func (db *DB) deleteOne(query string) string { rowid := "0" record := "" - + mtch := query.Get("match") for rows.Next() { record = "" rowid = "" @@ -352,9 +351,9 @@ func (db *DB) deleteOne(query string) string { } // Finds first obj match creteria. -func (db *DB) findById(query string) (res string) { - coll := gjson.Get(query, "collection").String() - id := gjson.Get(query, "_id").String() +func (db *DB) findById(query gjson.Result) (res string) { + coll := query.Get("collection").String() + id := query.Get("_id").String() stmt := `select record from ` + coll + ` where rowid = ` + id @@ -380,9 +379,9 @@ func (db *DB) findById(query string) (res string) { } // Insert -func (db *DB) insertOne(query string) (res string) { - coll := gjson.Get(query, "collection").String() - data := gjson.Get(query, "data").String() +func (db *DB) insertOne(query gjson.Result) (res string) { + coll := query.Get("collection").String() + data := query.Get("data").String() err := db.insert(coll, data) if err != nil { @@ -393,12 +392,12 @@ func (db *DB) insertOne(query string) (res string) { } // delete by id -func (db *DB) deleteById(query string) string { - id := gjson.Get(query, "_id").String() +func (db *DB) deleteById(query gjson.Result) string { + id := query.Get("_id").String() if id == "" { return `{"error": "there is no _id"}` } - coll := gjson.Get(query, "collection").String() + coll := query.Get("collection").String() if coll == "" { return `{"error": "there is no collection"}` } diff --git a/engine/store.go b/engine/store.go index 3d75023..ca32785 100644 --- a/engine/store.go +++ b/engine/store.go @@ -53,9 +53,9 @@ func NewDB(dbName string) *DB { } // InsertMany inserts list of object at one time -func (db *DB) insertMany(query string) (res string) { - coll := gjson.Get(query, "collection").String() - data := gjson.Get(query, "data").Array() +func (db *DB) insertMany(query gjson.Result) (res string) { + coll := query.Get("collection").String() + data := query.Get("data").Array() //d := strings.TrimLeft(obj, " ") // if len(d) == 0 {return fmt.Sprintf("len data is 0 %s\n", d)} diff --git a/engine/transaction.go b/engine/transaction.go index 67142e8..55d9482 100644 --- a/engine/transaction.go +++ b/engine/transaction.go @@ -8,14 +8,14 @@ import ( var str = fmt.Sprint -func transaction(query string) string { +func transaction(query gjson.Result) string { - actions := gjson.Get(query, "transaction").Array() + actions := query.Get("transaction").Array() start := "t " + str(len(actions)) + "\n" _ = start for k, v := range actions { fmt.Println(k, v) } - return "actions done" + return "not implement yet" } diff --git a/static/shell.html b/static/shell.html index 3d9c6d9..359e853 100644 --- a/static/shell.html +++ b/static/shell.html @@ -34,10 +34,10 @@

examples

insertMany inserts many data objects at one time 'bulk'

{action:"insertMany", collection:"test", data:[{name:"jalal", age:23},{name:"akram", age:30},{name:"hasna", age:35}]} -

select one object

+

select one object

{action:"findOne", collection:"users", match:{name:"adam"}} -

select objects match conditions

+

select objects match conditions

{action:"findMany", collection:"users", match:{name:"adam"}}

select objects that match the conditions

@@ -47,10 +47,12 @@

examples

select objects that match any value

{action:"findMany", collection:"users", match:{ age:{$in:[12, 23, 34]}}} +
{action:"findMany", collection:"users", match:{ name:{$in:["akram", "zaid"]}}}

select objects that do not match any value

- {action:"findMany", collection:"users", match:{ age:{$in:[12, 23, 34]}}} + {action:"findMany", collection:"users", match:{ age:{$nin:[12, 23, 34]}}} +
{action:"findMany", collection:"users", match:{ name:{$nin:["akram", "zaid"]}}}

select objects that match any conditions