Skip to content

Commit 57d7ab4

Browse files
authored
Merge branch 'main' into main
2 parents a460ba6 + 359eb60 commit 57d7ab4

File tree

9 files changed

+214
-122
lines changed

9 files changed

+214
-122
lines changed

go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
module github.com/liu-cn/json-filter
22

3-
go 1.17
4-
5-
require github.com/liu-cn/pkg v0.0.0-20221218135636-865c46b102ea
3+
go 1.17

test/array_test.go

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"github.com/liu-cn/json-filter/filter"
7+
"testing"
8+
)
9+
10+
type (
11+
Tag struct {
12+
Name string `json:"name,select($any)"`
13+
Icon string `json:"icon,omit($any)"`
14+
}
15+
16+
Array struct {
17+
A [1]Tag `json:"A,select(A|all),omit(A|all)"`
18+
B [2]Tag `json:"B,select(B|all),omit(B|all)"`
19+
C [3]Tag `json:"C,select(C|all),omit(C|all)"`
20+
AP *[1]Tag `json:"AP,select(AP|all),omit(AP|all)"`
21+
BP *[2]Tag `json:"BP,select(BP|all),omit(BP|all)"`
22+
CP *[3]Tag `json:"CP,select(CP|all),omit(CP|all)"`
23+
APP *[1]*Tag `json:"APP,select(APP|all),omit(APP|all)"`
24+
BPP *[2]*Tag `json:"BPP,select(BPP|all),omit(BPP|all)"`
25+
CPP *[3]*Tag `json:"CPP,select(CPP|all),omit(CPP|all)"`
26+
}
27+
)
28+
29+
var arrayWants = []string{
30+
"A",
31+
"B",
32+
"C",
33+
"AP",
34+
"BP",
35+
"CP",
36+
"APP",
37+
"BPP",
38+
"CPP",
39+
}
40+
41+
func getKeys(jsonStr string) string {
42+
maps := make(map[string]interface{})
43+
err := json.Unmarshal([]byte(jsonStr), &maps)
44+
if err != nil {
45+
panic(err)
46+
}
47+
keys := ""
48+
for k := range maps {
49+
keys += k + ","
50+
}
51+
return keys
52+
}
53+
54+
func newArray() *Array {
55+
56+
tag := Tag{Name: "tag"}
57+
tags1 := [1]Tag{tag}
58+
tags2 := [2]Tag{tag, tag}
59+
tags3 := [3]Tag{tag, tag, tag}
60+
tags1p := &[1]Tag{tag}
61+
tags2p := &[2]Tag{tag, tag}
62+
tags3p := &[3]Tag{tag, tag, tag}
63+
tags1pp := &[1]*Tag{&tag}
64+
tags2pp := &[2]*Tag{&tag, &tag}
65+
tags3pp := &[3]*Tag{&tag, &tag, &tag}
66+
67+
arr := &Array{
68+
A: tags1,
69+
B: tags2,
70+
C: tags3,
71+
AP: tags1p,
72+
BP: tags2p,
73+
CP: tags3p,
74+
APP: tags1pp,
75+
BPP: tags2pp,
76+
CPP: tags3pp,
77+
}
78+
return arr
79+
}
80+
81+
func TestSelectArray(t *testing.T) {
82+
for _, want := range arrayWants {
83+
fmt.Println(want, ":", filter.Select(want, newArray()))
84+
}
85+
//=== RUN TestSelectArray
86+
//A : {"A":[{"name":"tag"}]}
87+
//B : {"B":[{"name":"tag"},{"name":"tag"}]}
88+
//C : {"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
89+
//AP : {"AP":[{"name":"tag"}]}
90+
//BP : {"BP":[{"name":"tag"},{"name":"tag"}]}
91+
//CP : {"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
92+
//APP : {"APP":[{"name":"tag"}]}
93+
//BPP : {"BPP":[{"name":"tag"},{"name":"tag"}]}
94+
//CPP : {"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
95+
//--- PASS: TestSelectArray (0.00s)
96+
//PASS
97+
98+
}
99+
func TestSelectOmitTag(t *testing.T) {
100+
fmt.Println(filter.Select("any", newArray().CPP))
101+
fmt.Println(filter.Select("any", *newArray().CPP))
102+
fmt.Println(filter.Omit("any", newArray().CPP))
103+
fmt.Println(filter.Omit("any", *newArray().CPP))
104+
//=== RUN TestSelectOmitTag
105+
//[{"name":"tag"},{"name":"tag"},{"name":"tag"}]
106+
//[{"name":"tag"},{"name":"tag"},{"name":"tag"}]
107+
//[{"name":"tag"},{"name":"tag"},{"name":"tag"}]
108+
//[{"name":"tag"},{"name":"tag"},{"name":"tag"}]
109+
//--- PASS: TestSelectOmitTag (0.00s)
110+
//PASS
111+
}
112+
113+
func TestOmitArray(t *testing.T) {
114+
for _, want := range arrayWants {
115+
omit := filter.Omit(want, newArray())
116+
fmt.Println(want, ":", "keys:", getKeys(mustJson(omit)), omit)
117+
}
118+
//=== RUN TestOmitArray
119+
//A : keys: CP,CPP,AP,APP,B,BP,BPP,C, {"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
120+
//B : keys: BPP,C,CP,CPP,A,AP,APP,BP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
121+
//C : keys: A,AP,APP,B,BP,BPP,CP,CPP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
122+
//AP : keys: CPP,A,APP,B,BP,BPP,C,CP, {"A":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
123+
//BP : keys: APP,B,BPP,C,CP,CPP,A,AP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
124+
//CP : keys: CPP,A,AP,APP,B,BP,BPP,C, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
125+
//APP : keys: BP,BPP,C,CP,CPP,A,AP,B, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
126+
//BPP : keys: A,AP,APP,B,BP,C,CP,CPP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CPP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
127+
//CPP : keys: BPP,C,CP,A,AP,APP,B,BP, {"A":[{"name":"tag"}],"AP":[{"name":"tag"}],"APP":[{"name":"tag"}],"B":[{"name":"tag"},{"name":"tag"}],"BP":[{"name":"tag"},{"name":"tag"}],"BPP":[{"name":"tag"},{"name":"tag"}],"C":[{"name":"tag"},{"name":"tag"},{"name":"tag"}],"CP":[{"name":"tag"},{"name":"tag"},{"name":"tag"}]}
128+
//--- PASS: TestOmitArray (0.00s)
129+
//PASS
130+
131+
}
132+
133+
func TestEQ(t *testing.T) {
134+
135+
t.Run("select_eq", func(t *testing.T) {
136+
for _, want := range arrayWants {
137+
arr := newArray()
138+
ptr := mustJson(filter.Select(want, arr))
139+
val := mustJson(filter.Select(want, *arr))
140+
if ptr != val {
141+
t.Errorf("select传递指针和值结果不相等,want%s,ptr:%s,val:%s", want, ptr, val)
142+
}
143+
}
144+
})
145+
t.Run("omit_eq", func(t *testing.T) {
146+
for _, want := range arrayWants {
147+
arr := newArray()
148+
ptr := mustJson(filter.Omit(want, arr))
149+
val := mustJson(filter.Omit(want, *arr))
150+
if ptr != val {
151+
t.Errorf("omit传递指针和值结果不相等,want%s,ptr:%s,val:%s", want, ptr, val)
152+
}
153+
}
154+
})
155+
//=== RUN TestEQ
156+
//--- PASS: TestEQ (0.00s)
157+
//=== RUN TestEQ/select_eq
158+
//--- PASS: TestEQ/select_eq (0.00s)
159+
//=== RUN TestEQ/omit_eq
160+
//--- PASS: TestEQ/omit_eq (0.00s)
161+
//PASS
162+
163+
}

test/bench.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"time"
6+
)
7+
8+
func TimeAndRes(fn func() interface{}, runNum int) Info {
9+
now := time.Now()
10+
var res interface{}
11+
for i := 0; i < runNum; i++ {
12+
v := fn()
13+
if i == runNum-1 {
14+
res = v
15+
}
16+
}
17+
return Info{
18+
start: now,
19+
end: time.Now(),
20+
LastRes: res,
21+
}
22+
}
23+
24+
type Info struct {
25+
start time.Time
26+
end time.Time
27+
LastRes interface{}
28+
}
29+
30+
func (i *Info) Print(str ...interface{}) {
31+
s := ""
32+
for _, v := range str {
33+
s += fmt.Sprintf("%v", v)
34+
}
35+
36+
fmt.Println(s, i.end.Sub(i.start))
37+
}

test/cache_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@ package main
33
import (
44
"encoding/json"
55
"github.com/liu-cn/json-filter/filter"
6-
"github.com/liu-cn/pkg/benchmark"
76
)
87

98
func getCacheVal(s string, el interface{}, isSelect bool) string {
109
st := ""
11-
benchmark.TimeAndRes(func() interface{} {
10+
TimeAndRes(func() interface{} {
1211
if isSelect {
1312
ss := filter.Select(s, el)
1413
marshal, err := json.Marshal(ss)

test/main.go

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,9 @@ func mustJson(v interface{}) string {
1414
return string(marshal)
1515
}
1616

17-
type Uu struct {
18-
Name string `json:"name"`
19-
}
20-
2117
type UID [3]byte
2218
type UIDs []byte
2319

24-
//func (u UID) String() string {
25-
// return "uid"
26-
//}
27-
2820
func (u UID) MarshalText() (text []byte, err error) {
2921
return []byte("uid"), nil
3022
}
@@ -33,16 +25,11 @@ type Us struct {
3325
//Name string `json:"name,select(all),omit(h)"`
3426
B []byte `json:"b,select(all),omit(h)"`
3527
EmptySlice []string `json:"empty_slice,select(all),omit(h)"`
36-
37-
//H struct{} `json:"h,select(h)"`
38-
//Uu Uu `json:"uu,select(h),omit(h)"`
39-
//S []string `json:"s,select(h)"`
40-
41-
BB [3]byte `json:"bb,select(all)"`
42-
Avatar []byte `json:"avatar,select(all),func(GetAvatar)"`
43-
Avatar2 []byte `json:"avatar2,select(all),func(GetAvatar2)"`
44-
UID UID `json:"uid,select(all)"`
45-
UIDs UIDs `json:"uids,select(all)"`
28+
BB [3]byte `json:"bb,select(all)"`
29+
Avatar []byte `json:"avatar,select(all),func(GetAvatar)"`
30+
Avatar2 []byte `json:"avatar2,select(all),func(GetAvatar2)"`
31+
UID UID `json:"uid,select(all)"`
32+
UIDs UIDs `json:"uids,select(all)"`
4633
}
4734

4835
func (u Us) GetAvatar() string {
@@ -52,21 +39,6 @@ func (u *Us) GetAvatar2() string {
5239
return string(u.Avatar[:]) + ".jpg"
5340
}
5441

55-
func newUs() Us {
56-
return Us{
57-
//Name: "1",
58-
//H: struct{}{},
59-
//Uu: Uu{
60-
// Name: "uu",
61-
//},
62-
//S: []string{"1", "2"},
63-
}
64-
}
65-
66-
type Us2 struct {
67-
Data interface{} `json:"data,select(all)"`
68-
}
69-
7042
func main() {
7143
fmt.Println(filter.Omit("1111", Us2{Data: map[string]interface{}{
7244
"1": 1,
@@ -84,18 +56,8 @@ func main() {
8456
}
8557
list := []Us{u, u, u}
8658
fmt.Println(filter.Omit("1", &list))
87-
//return
88-
fmt.Println(mustJson(u))
89-
//fmt.Println(filter.Omit("h", u))
90-
//fmt.Println(filter.Select("all", u))
91-
//fmt.Println(filter.Omit("all", u))
92-
//fmt.Println(filter.Select("all", &u))
93-
//fmt.Println(filter.Omit("all", &u))
94-
//TestSlice()
95-
//TestMap()
96-
//TestU()
97-
98-
ExampleOmit()
59+
//fmt.Println(mustJson(u))
60+
//ExampleOmit()
9961
}
10062

10163
func ExampleOmit() {

test/map.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ func TestMap() {
2323
maps["test"] = &ptr
2424
mp := &maps
2525
mpp := &mp
26-
fmt.Println("select:", filter.SelectMarshal("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}).MustJSON())
26+
fmt.Println("select:", filter.Select("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}))
2727
// {"m":{"test":"c++从研发到脱发"},"mp":{"test":"c++从研发到脱发"},"mpp":{"test":"c++从研发到脱发"}}
2828

29-
fmt.Println("omit:", filter.OmitMarshal("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}).MustJSON())
29+
fmt.Println("omit:", filter.Select("test", Map{M: maps, T: maps, MP: mp, MPP: mpp}))
3030
//{"m":{"test":"c++从研发到脱发"},"mp":{"test":"c++从研发到脱发"},"mpp":{"test":"c++从研发到脱发"}}
3131
}

test/marshal_test.go

Lines changed: 0 additions & 41 deletions
This file was deleted.

test/skip.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

0 commit comments

Comments
 (0)