aboutsummaryrefslogtreecommitdiff
path: root/weed/query/json/query_json.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-10-06 22:35:05 -0700
committerChris Lu <chris.lu@gmail.com>2019-10-06 22:35:08 -0700
commitf8d4b7d1c01eecb54edc4169d6b8a0d3c39a730c (patch)
treee463982066e42bdabeae7cff5e0569c0874b4c39 /weed/query/json/query_json.go
parente26670c67ad27301dcfd597c94f5fce9b5cd6331 (diff)
downloadseaweedfs-f8d4b7d1c01eecb54edc4169d6b8a0d3c39a730c.tar.xz
seaweedfs-f8d4b7d1c01eecb54edc4169d6b8a0d3c39a730c.zip
support basic json filtering and selection
Diffstat (limited to 'weed/query/json/query_json.go')
-rw-r--r--weed/query/json/query_json.go106
1 files changed, 104 insertions, 2 deletions
diff --git a/weed/query/json/query_json.go b/weed/query/json/query_json.go
index 779aa96e9..b061df97d 100644
--- a/weed/query/json/query_json.go
+++ b/weed/query/json/query_json.go
@@ -1,5 +1,107 @@
package json
-func QueryJson(jsonLine string, query string) (jsonOutput string) {
- return jsonLine
+import (
+ "strconv"
+
+ "github.com/chrislusf/seaweedfs/weed/query/sqltypes"
+ "github.com/tidwall/gjson"
+ "github.com/tidwall/match"
+)
+
+type Query struct {
+ Field string
+ Op string
+ Value string
+}
+
+func QueryJson(jsonLine string, projections []string, query Query) (passedFilter bool, values []sqltypes.Value) {
+ if filterJson(jsonLine, query) {
+ passedFilter = true
+ fields := gjson.GetMany(jsonLine, projections...)
+ for _, f := range fields {
+ values = append(values, sqltypes.MakeTrusted(sqltypes.Type(f.Type), sqltypes.StringToBytes(f.Raw)))
+ }
+ return
+ }
+ return false, nil
+}
+
+func filterJson(jsonLine string, query Query) bool{
+
+ value := gjson.Get(jsonLine, query.Field)
+
+ // copied from gjson.go queryMatches() function
+ rpv := query.Value
+
+ if !value.Exists() {
+ return false
+ }
+ if query.Op == "" {
+ // the query is only looking for existence, such as:
+ // friends.#(name)
+ // which makes sure that the array "friends" has an element of
+ // "name" that exists
+ return true
+ }
+ switch value.Type {
+ case gjson.String:
+ switch query.Op {
+ case "=":
+ return value.Str == rpv
+ case "!=":
+ return value.Str != rpv
+ case "<":
+ return value.Str < rpv
+ case "<=":
+ return value.Str <= rpv
+ case ">":
+ return value.Str > rpv
+ case ">=":
+ return value.Str >= rpv
+ case "%":
+ return match.Match(value.Str, rpv)
+ case "!%":
+ return !match.Match(value.Str, rpv)
+ }
+ case gjson.Number:
+ rpvn, _ := strconv.ParseFloat(rpv, 64)
+ switch query.Op {
+ case "=":
+ return value.Num == rpvn
+ case "!=":
+ return value.Num != rpvn
+ case "<":
+ return value.Num < rpvn
+ case "<=":
+ return value.Num <= rpvn
+ case ">":
+ return value.Num > rpvn
+ case ">=":
+ return value.Num >= rpvn
+ }
+ case gjson.True:
+ switch query.Op {
+ case "=":
+ return rpv == "true"
+ case "!=":
+ return rpv != "true"
+ case ">":
+ return rpv == "false"
+ case ">=":
+ return true
+ }
+ case gjson.False:
+ switch query.Op {
+ case "=":
+ return rpv == "false"
+ case "!=":
+ return rpv != "false"
+ case "<":
+ return rpv == "true"
+ case "<=":
+ return true
+ }
+ }
+ return false
+
}