def add_field_or_query(clone, field_name): facet_cls = clone.searcher.facet_settings.get(field_name) if facet_cls and hasattr(facet_cls, "queries"): for (fv_field_op, fv_val), title, help_text in unpack_tuples(facet_cls.queries, 3): fv_field, fv_op = split_param(fv_field_op) if "facet.query" not in clone._params: clone._params["facet.query"] = [] if fv_field == field_name: clone._params["facet.query"].append(OPS_FOR_FACET.get(fv_op, "exact")(field_name, fv_val)) else: if "facet.field" not in clone._params: clone._params["facet.field"] = [] clone._params["facet.field"].append(field_name) if hasattr(facet_cls, "default_params"): for facet_param, val in facet_cls.default_params.items(): clone._params["f.%s.facet.%s" % (field_name, facet_param)] = val if params and field_name in params: for facet_param, val in params[field_name].items(): clone._params["f.%s.facet.%s" % (field_name, facet_param)] = val
def _process_facets(self, facets): def grouped_list(l, group_by=2): res = [] for i in range(len(l)): if i % group_by == 0: res.append((l[i], l[i + 1])) return res # example # {'facet_fields': {'categories': ['13', 92746, '28', 73406, '15', 55351, '1307', 43146]}} _facets = {"facet_fields": [], "facet_queries": [], "facet_dates": []} if facets: for f_key, f_value in facets["facet_fields"].items(): _facets["facet_fields"].append([f_key, grouped_list(f_value)]) for f_key, f_value in facets["facet_queries"].items(): _facets["facet_queries"].append((f_key, f_value)) # print _facets['facet_queries'] facets = [] facet_class_map = {} filters_map = convert_fq_to_filters_map(self._fq) # print filters_map # facet fields for _facet in _facets["facet_fields"]: facet_name = _facet[0] facet_cls = self.searcher.facet_settings.get(facet_name, Facet) facet = facet_cls(self, name=facet_name) facet_class_map[facet_cls] = facet for fv_name, fv_count in _facet[1]: selected = False if facet_name in filters_map and fv_name in filters_map[facet_name]: selected = True facet.add_value(FacetValue(facet_name, fv_name, fv_count, selected)) facets.append(facet) # facet queries for facet_query, facet_count in _facets["facet_queries"]: facet_name, facet_cond = facet_query.split(":") facet_cls = self.searcher.facet_settings.get(facet_name, Facet) if facet_cls not in facet_class_map: facet = facet_cls(self, name=facet_name) facet_class_map[facet_cls] = facet for (fv_param, fv_val), fv_title, fv_help_text in unpack_tuples(facet.queries, 3): fv_field, fv_op = split_param(fv_param) if OPS_FOR_FACET[fv_op](fv_field, fv_val) == facet_query: break selected = facet_name in filters_map and facet_cond in filters_map[facet_name] fv_param = make_param(facet_name, fv_op) fv_val = process_value(fv_val) facet.add_value(FacetValue(fv_param, fv_val, facet_count, selected, fv_title, fv_help_text)) facets.append(facet) else: facet = facet_class_map[facet_cls] for (fv_param, fv_val), fv_title, fv_help_text in unpack_tuples(facet.queries, 3): fv_field, fv_op = split_param(fv_param) if OPS_FOR_FACET[fv_op](fv_field, fv_val) == facet_query: break selected = facet_name in filters_map and facet_cond in filters_map[facet_name] fv_param = make_param(facet_name, fv_op) fv_val = process_value(fv_val) facet_class_map[facet_cls].add_value( FacetValue(fv_param, fv_val, facet_count, selected, fv_title, fv_help_text) ) return facets