Skip to content

Commit ebddbd1

Browse files
author
Antoine Huret
committed
add combined criterions operators
1 parent 403a159 commit ebddbd1

File tree

2 files changed

+66
-8
lines changed

2 files changed

+66
-8
lines changed

README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,19 @@ one2many and many2many are represented by the `Relation` type and allow you to e
167167

168168
### Criteria and Options
169169

170-
`Criteria` is a set of criterion and allow you to query models. [More informations](https://www.odoo.com/documentation/13.0/reference/orm.html#search-domains)
170+
`Criteria` is a set of Criterion and allow you to query models. [More informations](https://www.odoo.com/documentation/13.0/reference/orm.html#search-domains)
171+
172+
#### Combined Criterions
173+
174+
Criterions can be combined using AND (arity 2), OR (arity 2) and NOT (arity 1) operators.
175+
Criteria have And, Or and Not methods to be able to do such query eg:
176+
177+
```go
178+
c := odoo.NewCriteria().Or(
179+
odoo.NewCriterion("user_id.name", "=", "Jane Doe"),
180+
odoo.NewCriterion("user_id.name", "=", "John Doe"),
181+
)
182+
```
171183

172184
`Options` allow you to filter results.
173185

odoo.go

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,74 @@ func (c *Client) Version() (Version, error) {
8282
return v, nil
8383
}
8484

85-
type criterion []interface{}
85+
type combinedCriterionOperator string
86+
87+
const (
88+
and combinedCriterionOperator = "&"
89+
or = "|"
90+
not = "!"
91+
)
92+
93+
type Criterion []interface{}
94+
95+
func (c *Criterion) ToInterface() []interface{} {
96+
if c != nil {
97+
return ([]interface{})(*c)
98+
}
99+
return []interface{}{}
100+
}
101+
102+
type combinedCriterions struct {
103+
combinedCriterionOperator
104+
Criterions []*Criterion
105+
}
86106

87107
/*
88-
Criteria is a set of criterion, each criterion is a triple (field_name, operator, value).
108+
Criteria is a set of Criterion, each Criterion is a triple (field_name, operator, value).
89109
It allow you to search models.
90110
see documentation: https://www.odoo.com/documentation/13.0/reference/orm.html#reference-orm-domains
91111
*/
92-
type Criteria []*criterion
112+
type Criteria []interface{}
93113

94114
// NewCriteria creates a new *Criteria.
95115
func NewCriteria() *Criteria {
96116
return &Criteria{}
97117
}
98118

99-
func newCriterion(field, operator string, value interface{}) *criterion {
100-
c := criterion(newTuple(field, operator, value))
119+
func NewCriterion(field, operator string, value interface{}) *Criterion {
120+
c := Criterion(newTuple(field, operator, value))
101121
return &c
102122
}
103123

104-
// Add a new criterion to a *Criteria.
124+
// Add a new Criterion to a *Criteria.
105125
func (c *Criteria) Add(field, operator string, value interface{}) *Criteria {
106-
*c = append(*c, newCriterion(field, operator, value))
126+
*c = append(*c, NewCriterion(field, operator, value).ToInterface())
127+
return c
128+
}
129+
130+
// Add a new Criterion to a *Criteria.
131+
func (c *Criteria) AddCriterion(cri *Criterion) *Criteria {
132+
*c = append(*c, cri.ToInterface())
133+
return c
134+
}
135+
136+
func (c *Criteria) And(c1, c2 *Criterion) *Criteria {
137+
return c.combinedCriterions(and, c1, c2)
138+
}
139+
140+
func (c *Criteria) Or(c1, c2 *Criterion) *Criteria {
141+
return c.combinedCriterions(or, c1, c2)
142+
}
143+
144+
func (c *Criteria) Not(cri *Criterion) *Criteria {
145+
return c.combinedCriterions(not, cri)
146+
}
147+
148+
func (c *Criteria) combinedCriterions(op combinedCriterionOperator, cc ...*Criterion) *Criteria {
149+
*c = append(*c, op)
150+
for _, cri := range cc {
151+
*c = append(*c, cri.ToInterface())
152+
}
107153
return c
108154
}
109155

0 commit comments

Comments
 (0)