@@ -58,6 +58,21 @@ func (f *FilterBuilder) ExecuteToWithContext(ctx context.Context, to interface{}
5858
5959var filterOperators = []string {"eq" , "neq" , "gt" , "gte" , "lt" , "lte" , "like" , "ilike" , "is" , "in" , "cs" , "cd" , "sl" , "sr" , "nxl" , "nxr" , "adj" , "ov" , "fts" , "plfts" , "phfts" , "wfts" }
6060
61+ // appendFilter is a helper method that appends a filter to existing filters on a column
62+ func (f * FilterBuilder ) appendFilter (column , filterValue string ) * FilterBuilder {
63+ if existing , ok := f .params [column ]; ok && existing != "" {
64+ // If a filter already exists for this column, combine with 'and'
65+ f .params ["and" ] = fmt .Sprintf ("(%s.%s,%s.%s)" , column , existing , column , filterValue )
66+ delete (f .params , column )
67+ } else if existingAnd , ok := f .params ["and" ]; ok {
68+ // If an 'and' parameter already exists, append to it
69+ f .params ["and" ] = strings .TrimSuffix (existingAnd , ")" ) + "," + column + "." + filterValue + ")"
70+ } else {
71+ f .params [column ] = filterValue
72+ }
73+ return f
74+ }
75+
6176func isOperator (value string ) bool {
6277 for _ , operator := range filterOperators {
6378 if value == operator {
@@ -74,8 +89,7 @@ func (f *FilterBuilder) Filter(column, operator, value string) *FilterBuilder {
7489 f .client .ClientError = fmt .Errorf ("invalid filter operator" )
7590 return f
7691 }
77- f .params [column ] = fmt .Sprintf ("%s.%s" , operator , value )
78- return f
92+ return f .appendFilter (column , fmt .Sprintf ("%s.%s" , operator , value ))
7993}
8094
8195func (f * FilterBuilder ) And (filters , foreignTable string ) * FilterBuilder {
@@ -100,60 +114,50 @@ func (f *FilterBuilder) Not(column, operator, value string) *FilterBuilder {
100114 if ! isOperator (operator ) {
101115 return f
102116 }
103- f .params [column ] = fmt .Sprintf ("not.%s.%s" , operator , value )
104- return f
117+ return f .Filter (column , "not." + operator , value )
105118}
106119
107120func (f * FilterBuilder ) Match (userQuery map [string ]string ) * FilterBuilder {
108121 for key , value := range userQuery {
109- f .params [ key ] = "eq." + value
122+ f .Filter ( key , "eq" , value )
110123 }
111124 return f
112125}
113126
114127func (f * FilterBuilder ) Eq (column , value string ) * FilterBuilder {
115- f .params [column ] = "eq." + value
116- return f
128+ return f .Filter (column , "eq" , value )
117129}
118130
119131func (f * FilterBuilder ) Neq (column , value string ) * FilterBuilder {
120- f .params [column ] = "neq." + value
121- return f
132+ return f .Filter (column , "neq" , value )
122133}
123134
124135func (f * FilterBuilder ) Gt (column , value string ) * FilterBuilder {
125- f .params [column ] = "gt." + value
126- return f
136+ return f .Filter (column , "gt" , value )
127137}
128138
129139func (f * FilterBuilder ) Gte (column , value string ) * FilterBuilder {
130- f .params [column ] = "gte." + value
131- return f
140+ return f .Filter (column , "gte" , value )
132141}
133142
134143func (f * FilterBuilder ) Lt (column , value string ) * FilterBuilder {
135- f .params [column ] = "lt." + value
136- return f
144+ return f .Filter (column , "lt" , value )
137145}
138146
139147func (f * FilterBuilder ) Lte (column , value string ) * FilterBuilder {
140- f .params [column ] = "lte." + value
141- return f
148+ return f .Filter (column , "lte" , value )
142149}
143150
144151func (f * FilterBuilder ) Like (column , value string ) * FilterBuilder {
145- f .params [column ] = "like." + value
146- return f
152+ return f .Filter (column , "like" , value )
147153}
148154
149155func (f * FilterBuilder ) Ilike (column , value string ) * FilterBuilder {
150- f .params [column ] = "ilike." + value
151- return f
156+ return f .Filter (column , "ilike" , value )
152157}
153158
154159func (f * FilterBuilder ) Is (column , value string ) * FilterBuilder {
155- f .params [column ] = "is." + value
156- return f
160+ return f .Filter (column , "is" , value )
157161}
158162
159163func (f * FilterBuilder ) In (column string , values []string ) * FilterBuilder {
@@ -167,8 +171,7 @@ func (f *FilterBuilder) In(column string, values []string) *FilterBuilder {
167171 cleanedValues = append (cleanedValues , value )
168172 }
169173 }
170- f .params [column ] = fmt .Sprintf ("in.(%s)" , strings .Join (cleanedValues , "," ))
171- return f
174+ return f .appendFilter (column , fmt .Sprintf ("in.(%s)" , strings .Join (cleanedValues , "," )))
172175}
173176
174177func (f * FilterBuilder ) Contains (column string , value []string ) * FilterBuilder {
@@ -179,8 +182,7 @@ func (f *FilterBuilder) Contains(column string, value []string) *FilterBuilder {
179182
180183 valueString := fmt .Sprintf ("{%s}" , strings .Join (newValue , "," ))
181184
182- f .params [column ] = "cs." + valueString
183- return f
185+ return f .appendFilter (column , "cs." + valueString )
184186}
185187
186188func (f * FilterBuilder ) ContainedBy (column string , value []string ) * FilterBuilder {
@@ -191,51 +193,45 @@ func (f *FilterBuilder) ContainedBy(column string, value []string) *FilterBuilde
191193
192194 valueString := fmt .Sprintf ("{%s}" , strings .Join (newValue , "," ))
193195
194- f .params [column ] = "cd." + valueString
195- return f
196+ return f .appendFilter (column , "cd." + valueString )
196197}
197198
198199func (f * FilterBuilder ) ContainsObject (column string , value interface {}) * FilterBuilder {
199200 sum , err := json .Marshal (value )
200201 if err != nil {
201202 f .client .ClientError = err
203+ return f
202204 }
203- f .params [column ] = "cs." + string (sum )
204- return f
205+ return f .appendFilter (column , "cs." + string (sum ))
205206}
206207
207208func (f * FilterBuilder ) ContainedByObject (column string , value interface {}) * FilterBuilder {
208209 sum , err := json .Marshal (value )
209210 if err != nil {
210211 f .client .ClientError = err
212+ return f
211213 }
212- f .params [column ] = "cs." + string (sum )
213- return f
214+ return f .appendFilter (column , "cd." + string (sum ))
214215}
215216
216217func (f * FilterBuilder ) RangeLt (column , value string ) * FilterBuilder {
217- f .params [column ] = "sl." + value
218- return f
218+ return f .appendFilter (column , "sl." + value )
219219}
220220
221221func (f * FilterBuilder ) RangeGt (column , value string ) * FilterBuilder {
222- f .params [column ] = "sr." + value
223- return f
222+ return f .appendFilter (column , "sr." + value )
224223}
225224
226225func (f * FilterBuilder ) RangeGte (column , value string ) * FilterBuilder {
227- f .params [column ] = "nxl." + value
228- return f
226+ return f .appendFilter (column , "nxl." + value )
229227}
230228
231229func (f * FilterBuilder ) RangeLte (column , value string ) * FilterBuilder {
232- f .params [column ] = "nxr." + value
233- return f
230+ return f .appendFilter (column , "nxr." + value )
234231}
235232
236233func (f * FilterBuilder ) RangeAdjacent (column , value string ) * FilterBuilder {
237- f .params [column ] = "adj." + value
238- return f
234+ return f .appendFilter (column , "adj." + value )
239235}
240236
241237func (f * FilterBuilder ) Overlaps (column string , value []string ) * FilterBuilder {
@@ -245,8 +241,7 @@ func (f *FilterBuilder) Overlaps(column string, value []string) *FilterBuilder {
245241 }
246242
247243 valueString := fmt .Sprintf ("{%s}" , strings .Join (newValue , "," ))
248- f .params [column ] = "ov." + valueString
249- return f
244+ return f .appendFilter (column , "ov." + valueString )
250245}
251246
252247// TextSearch performs a full-text search filter. For more information, see
@@ -268,8 +263,7 @@ func (f *FilterBuilder) TextSearch(column, userQuery, config, tsType string) *Fi
268263 if config != "" {
269264 configPart = fmt .Sprintf ("(%s)" , config )
270265 }
271- f .params [column ] = typePart + "fts" + configPart + "." + userQuery
272- return f
266+ return f .appendFilter (column , typePart + "fts" + configPart + "." + userQuery )
273267}
274268
275269// OrderOpts describes the options to be provided to Order.
0 commit comments