-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathexample_test.go
122 lines (113 loc) · 3.39 KB
/
example_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package godnf_test
import (
"fmt"
dnf "github.com/brg-liuwei/godnf"
)
type adAttr struct {
h int
w int
duration int
}
func (attr adAttr) ToString() string {
return fmt.Sprintf("{height: %d, width: %d, duration: %d}", attr.h, attr.w, attr.duration)
}
func (attr adAttr) ToMap() map[string]interface{} {
return map[string]interface{}{
"height": attr.h,
"width": attr.w,
"duration": attr.duration,
}
}
func Example() {
dnf.SetDebug(true)
dnf.SetHandler(dnf.NewHandler())
h := dnf.GetHandler()
var err error
err = h.AddDoc("ad0", "0", "(region in {ShangHai, Beijing} and age not in {3, 4})", adAttr{300, 250, 20})
if err != nil {
panic(err)
}
err = h.AddDoc("ad1", "1", "(region in {ShenZhen, ShangHai}) or (age not in {4, 6})", adAttr{300, 250, 15})
if err != nil {
panic(err)
}
err = h.AddDoc("ad2", "2", "(region in {ShangHai, NanJing} and age not in {3, 5, 6})", adAttr{300, 250, 10})
if err != nil {
panic(err)
}
err = h.AddDoc("ad3", "3", "(region in {ChengDu, Beijing, WuHan}) or (age not in {4, 3})", adAttr{300, 250, 30})
if err != nil {
panic(err)
}
err = h.AddDoc("ad4", "4", "(age not in {3, 4})", adAttr{300, 250, 35})
if err != nil {
panic(err)
}
conds := []dnf.Cond{
{"region", "NanJing"},
{"age", "5"},
}
var docs []int
docs, err = h.Search(conds, func(a dnf.DocAttr) bool { return a.(adAttr).duration <= 30 })
if err != nil {
panic(err)
}
fmt.Println("docs:", docs)
for _, doc := range docs {
m := h.DocId2Map(doc)
fmt.Printf("doc[%d] map: height: %d, width: %d, duration: %d\n",
doc, m["height"], m["width"], m["duration"])
attr, _ := h.DocId2Attr(doc)
adAttr := attr.(adAttr)
fmt.Printf("doc[%d] attr: height: %d, width: %d, duration: %d\n",
doc, adAttr.h, adAttr.w, adAttr.duration)
}
h.DisplayDocs()
fmt.Println()
h.DisplayConjRevs()
fmt.Println()
h.DisplayConjRevs2()
// Output:
// docs: [1 3]
// doc[1] map: height: 300, width: 250, duration: 15
// doc[1] attr: height: 300, width: 250, duration: 15
// doc[3] map: height: 300, width: 250, duration: 30
// doc[3] attr: height: 300, width: 250, duration: 30
// len(docs): 5
// Doc[ 0 ]: ( region ∈ { ShangHai, Beijing } ∩ age ∉ { 3, 4 } )
// Attr: {height: 300, width: 250, duration: 20}
// Doc[ 1 ]: ( region ∈ { ShangHai, ShenZhen } ) ∪ ( age ∉ { 4, 6 } )
// Attr: {height: 300, width: 250, duration: 15}
// Doc[ 2 ]: ( region ∈ { ShangHai, NanJing } ∩ age ∉ { 3, 6, 5 } )
// Attr: {height: 300, width: 250, duration: 10}
// Doc[ 3 ]: ( region ∈ { Beijing, ChengDu, WuHan } ) ∪ ( age ∉ { 3, 4 } )
// Attr: {height: 300, width: 250, duration: 30}
// Doc[ 4 ]: ( age ∉ { 3, 4 } )
// Attr: {height: 300, width: 250, duration: 35}
//
// reverse list 1:
// conj[0]: -> 0
// conj[1]: -> 1
// conj[2]: -> 1
// conj[3]: -> 2
// conj[4]: -> 3
// conj[5]: -> 3 4
//
// reverse list 2:
// ***** size: 0 *****
// ∅ -> (2 ∈) (5 ∈)
// ( age 3 ) -> (5 ∉)
// ( age 4 ) -> (2 ∉) (5 ∉)
// ( age 6 ) -> (2 ∉)
// ***** size: 1 *****
// ( region ShangHai ) -> (0 ∈) (1 ∈) (3 ∈)
// ( region Beijing ) -> (0 ∈) (4 ∈)
// ( age 3 ) -> (0 ∉) (3 ∉)
// ( age 4 ) -> (0 ∉)
// ( region ShenZhen ) -> (1 ∈)
// ( age 6 ) -> (3 ∉)
// ( region NanJing ) -> (3 ∈)
// ( age 5 ) -> (3 ∉)
// ( region ChengDu ) -> (4 ∈)
// ( region WuHan ) -> (4 ∈)
}