applyFacetsTree : we return error only when query has some problems. like Or has 3 arguments, argument facet val overflows integer. returns true if postingFacets can be included.
(postingFacets []*api.Facet, ftree *facetsTree)
| 2289 | // like Or has 3 arguments, argument facet val overflows integer. |
| 2290 | // returns true if postingFacets can be included. |
| 2291 | func applyFacetsTree(postingFacets []*api.Facet, ftree *facetsTree) (bool, error) { |
| 2292 | if ftree == nil { |
| 2293 | return true, nil |
| 2294 | } |
| 2295 | if ftree.function != nil { |
| 2296 | var fc *api.Facet |
| 2297 | for _, fci := range postingFacets { |
| 2298 | if fci.Key == ftree.function.key { |
| 2299 | fc = fci |
| 2300 | break |
| 2301 | } |
| 2302 | } |
| 2303 | if fc == nil { // facet is not there |
| 2304 | return false, nil |
| 2305 | } |
| 2306 | |
| 2307 | switch ftree.function.fnType { |
| 2308 | case compareAttrFn: // lt, gt, le, ge, eq |
| 2309 | fVal, err := facets.ValFor(fc) |
| 2310 | if err != nil { |
| 2311 | return false, err |
| 2312 | } |
| 2313 | |
| 2314 | v, ok := ftree.function.typesToVal[fVal.Tid] |
| 2315 | if !ok { |
| 2316 | // Not found in map and hence convert it here. |
| 2317 | v, err = types.Convert(ftree.function.val, fVal.Tid) |
| 2318 | if err != nil { |
| 2319 | // ignore facet if not of appropriate type. |
| 2320 | return false, nil |
| 2321 | } |
| 2322 | } |
| 2323 | |
| 2324 | return types.CompareVals(ftree.function.name, fVal, v), nil |
| 2325 | |
| 2326 | case standardFn: // allofterms, anyofterms |
| 2327 | facetType, err := facets.TypeIDFor(fc) |
| 2328 | if err != nil { |
| 2329 | return false, err |
| 2330 | } |
| 2331 | if facetType != types.StringID { |
| 2332 | return false, nil |
| 2333 | } |
| 2334 | return filterOnStandardFn(ftree.function.name, fc.Tokens, ftree.function.tokens) |
| 2335 | } |
| 2336 | return false, errors.Errorf("Fn %s not supported in facets filtering.", ftree.function.name) |
| 2337 | } |
| 2338 | |
| 2339 | res := make([]bool, 0, 2) // We can have max two children for a node. |
| 2340 | for _, c := range ftree.children { |
| 2341 | r, err := applyFacetsTree(postingFacets, c) |
| 2342 | if err != nil { |
| 2343 | return false, err |
| 2344 | } |
| 2345 | res = append(res, r) |
| 2346 | } |
| 2347 | |
| 2348 | // we have already checked for number of children in preprocessFilter |
no test coverage detected