Esempio n. 1
0
def compound_facet_factory(name, title, facets, **attrs):
    def _init(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)
        self.name = name

    def _add_value(self, facet_value):
        def fv_cmp(fv1, fv2):
            facet_cls1 = self.paramvalue_to_facet_cls_map.get((fv1.param, fv1.value))
            facet_cls2 = self.paramvalue_to_facet_cls_map.get((fv2.param, fv2.value))
            try:
                ix1 = self.facets.index(facet_cls1)
                ix2 = self.facets.index(facet_cls2)
                ret = cmp(ix1, ix2)
                if ret == 0:
                    return cmp(fv1.count, fv2.count)
                return ret
            except ValueError:
                return 0

        facet_cls = self.paramvalue_to_facet_cls_map.get((facet_value.param, facet_value.value))
        facet = facet_cls(self.query)
        facet.add_value(facet_value)
        facet_value._facet = self
        if facet_value.selected:
            self._selected_values.append(facet_value)
            self._selected_values.sort(cmp=fv_cmp)
        else:
            self._values.append(facet_value)
            self._values.sort(cmp=fv_cmp)

    attrs['facets'] = facets
    attrs['fields'] = [facet.field for facet in facets]
    attrs['queries'] = []
    attrs['paramvalue_to_facet_cls_map'] = {}
    for facet in facets:
        if hasattr(facet, 'queries') and facet.queries:
            attrs['queries'] += facet.queries
            for q in facet.queries:
                attrs['paramvalue_to_facet_cls_map'][(make_param(*split_param(q[0][0])), process_value(q[0][1]))] = facet
    attrs['name'] = name
    attrs['title'] = title
    attrs['add_value'] = _add_value
    attrs['__init__'] = _init
    return type('CompoundFacet', (Facet,), attrs)
Esempio n. 2
0
 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
Esempio n. 3
0
    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