-
Notifications
You must be signed in to change notification settings - Fork 9
/
toy_brick_condition.go
122 lines (112 loc) · 3.42 KB
/
toy_brick_condition.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
/*
* Copyright 2018. bigpigeon. All rights reserved.
* Use of this source code is governed by a MIT style
* license that can be found in the LICENSE file.
*/
package toyorm
type ToyBrickAnd struct {
Brick *ToyBrick
}
func (t ToyBrickAnd) Condition(expr SearchExpr, key FieldSelection, v ...interface{}) *ToyBrick {
search := t.Brick.condition(expr, key, v...)
return t.Conditions(search)
}
func (t ToyBrickAnd) ConditionGroup(expr SearchExpr, group interface{}) *ToyBrick {
search := t.Brick.conditionGroup(expr, group)
return t.Conditions(search)
}
func (t ToyBrickAnd) Conditions(search SearchList) *ToyBrick {
return t.Brick.Scope(func(t *ToyBrick) *ToyBrick {
if len(search) == 0 {
return t
}
newSearch := make(SearchList, len(t.Search), len(t.Search)+len(search))
copy(newSearch, t.Search)
newOwnSearch := make([]int, len(t.OwnSearch), len(t.OwnSearch)+len(search))
copy(newOwnSearch, t.OwnSearch)
if len(t.Search) != 0 {
// AND have high priority
if newSearch[len(newSearch)-1].Type == ExprOr {
start := len(newSearch) - 1
newSearch = newSearch[:start]
newSearch = append(newSearch, search...)
// add join own information
for i, s := range newSearch[start:] {
if s.Type.IsBranch() == false {
newOwnSearch = append(newOwnSearch, start+i)
}
}
newSearch = append(newSearch, NewSearchBranch(ExprAnd), NewSearchBranch(ExprOr))
} else {
start := len(newSearch)
newSearch = append(newSearch, search...)
// add join own information
for i, s := range newSearch[start:] {
if s.Type.IsBranch() == false {
newOwnSearch = append(newOwnSearch, start+i)
}
}
newSearch = append(newSearch, NewSearchBranch(ExprAnd))
}
} else {
start := len(newSearch)
newSearch = append(newSearch, search...)
// add join own information
for i, s := range newSearch[start:] {
if s.Type.IsBranch() == false {
newOwnSearch = append(newOwnSearch, start+i)
}
}
}
newt := *t
newt.Search = newSearch
newt.OwnSearch = newOwnSearch
return &newt
})
}
type ToyBrickOr struct {
Brick *ToyBrick
}
func (t ToyBrickOr) Condition(expr SearchExpr, key FieldSelection, v ...interface{}) *ToyBrick {
search := t.Brick.condition(expr, key, v...)
return t.Conditions(search)
}
func (t ToyBrickOr) ConditionGroup(expr SearchExpr, group interface{}) *ToyBrick {
search := t.Brick.conditionGroup(expr, group)
return t.Conditions(search)
}
func (t ToyBrickOr) Conditions(search SearchList) *ToyBrick {
return t.Brick.Scope(func(t *ToyBrick) *ToyBrick {
if len(search) == 0 {
return t
}
newSearch := make(SearchList, len(t.Search), len(t.Search)+len(search))
copy(newSearch, t.Search)
newOwnSearch := make([]int, len(t.OwnSearch), len(t.OwnSearch)+len(search))
copy(newOwnSearch, t.OwnSearch)
if len(newSearch) != 0 {
start := len(newSearch)
newSearch = append(newSearch, search...)
// add join own information
for i, s := range newSearch[start:] {
if s.Type.IsBranch() == false {
newOwnSearch = append(newOwnSearch, start+i)
}
}
newSearch = append(newSearch, NewSearchBranch(ExprOr))
} else {
start := len(newSearch)
newSearch = append(newSearch, search...)
// add join own information
for i, s := range newSearch[start:] {
if s.Type.IsBranch() == false {
newOwnSearch = append(newOwnSearch, start+i)
}
}
}
newt := *t
newt.Search = newSearch
newt.OwnSearch = newOwnSearch
return &newt
})
}