def add_stats_ranges_from_solr(self, query): """ gets solr stats by searching solr searches solr to get raw solr search results """ stats_query = self.compose_query() # make the stats query response = self.solr.search(**stats_query) # execute solr query solr_json = response.raw_content if isinstance(solr_json, dict): if 'stats' in solr_json: if 'stats_fields' in solr_json['stats']: qm = QueryMaker() groups = qm.histogram_groups for solr_field_key, stats in solr_json['stats']['stats_fields'].items(): if stats is not None: if solr_field_key not in query['facet.range']: query['facet.range'].append(solr_field_key) if solr_field_key not in query['stats.field']: query['stats.field'].append(solr_field_key) fstart = 'f.' + solr_field_key + '.facet.range.start' fend = 'f.' + solr_field_key + '.facet.range.end' fgap = 'f.' + solr_field_key + '.facet.range.gap' findex = 'f.' + solr_field_key + '.facet.sort' fother = 'f.' + solr_field_key + '.facet.range.other' finclude = 'f.' + solr_field_key + '.facet.range.include' query[fother] = 'all' query[finclude] = 'all' if 'count' in stats: if (stats['count'] / qm.histogram_groups) < 3: groups = 4 if '___pred_date' in solr_field_key: query[fstart] = qm.convert_date_to_solr_date(stats['min']) query[fend] = qm.convert_date_to_solr_date(stats['max']) query[fgap] = qm.get_date_difference_for_solr(stats['min'], stats['max'], groups) query[findex] = 'index' # sort by index, not by count else: query[fstart] = stats['min'] query[fend] = stats['max'] query[fgap] = ((stats['max'] - stats['min']) / groups) if query[fgap] > stats['mean']: query[fgap] = stats['mean'] / 3; # query[fgap] = ((stats['max'] - stats['min']) / groups) - ((stats['max'] - stats['min']) / groups) * .01 query[findex] = 'index' # sort by index, not by count return query
def add_date_fields(self, solr_json): """ adds numeric fields with query options """ date_fields = [] date_facet_ranges = self.get_solr_ranges(solr_json, 'date') if date_facet_ranges is not False: for solr_field_key, ranges in date_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min-date'] = ranges['start'] field['oc-api:max-date'] = ranges['end'] field['oc-api:gap-date'] = ranges['gap'] field['oc-api:has-range-options'] = [] i = -1 qm = QueryMaker() for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True dt_end = qm.add_solr_gap_to_date(range_min_key, ranges['gap']) range_end = qm.convert_date_to_solr_date(dt_end) solr_range = '[' + range_min_key + ' TO ' + range_end + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url( new_rparams, '.json') range_dict['label'] = qm.make_human_readable_date( range_min_key) + ' to ' + qm.make_human_readable_date( range_end) range_dict['count'] = solr_count range_dict['oc-api:min-date'] = range_min_key range_dict['oc-api:max-date'] = range_end field['oc-api:has-range-options'].append(range_dict) date_fields.append(field) if len(date_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-date-facets'] = date_fields
def add_date_fields(self, solr_json): """ adds numeric fields with query options """ date_fields = [] date_facet_ranges = self.get_solr_ranges(solr_json, 'date') if date_facet_ranges is not False: for solr_field_key, ranges in date_facet_ranges.items(): facet_key_list = solr_field_key.split('___') slug = facet_key_list[0].replace('_', '-') # check to see if the field is a linkded data field # if so, it needs some help with making Filter Links linked_field = False field_entity = self.get_entity(slug) if field_entity is not False: self.add_active_facet_field(slug) if field_entity.item_type == 'uri': linked_field = True field = self.get_facet_meta(solr_field_key) field['oc-api:min-date'] = ranges['start'] field['oc-api:max-date'] = ranges['end'] field['oc-api:gap-date'] = ranges['gap'] field['oc-api:has-range-options'] = [] i = -1 qm = QueryMaker() for range_min_key in ranges['counts'][::2]: i += 2 solr_count = ranges['counts'][i] fl = FilterLinks() fl.base_search_link = self.base_search_link fl.base_request_json = self.request_dict_json fl.base_r_full_path = self.request_full_path fl.spatial_context = self.spatial_context fl.partial_param_val_match = True dt_end = qm.add_solr_gap_to_date(range_min_key, ranges['gap']) range_end = qm.convert_date_to_solr_date(dt_end) solr_range = '[' + range_min_key + ' TO ' + range_end + ' ]' new_rparams = fl.add_to_request('prop', solr_range, slug) range_dict = LastUpdatedOrderedDict() range_dict['id'] = fl.make_request_url(new_rparams) range_dict['json'] = fl.make_request_url(new_rparams, '.json') range_dict['label'] = qm.make_human_readable_date(range_min_key) + ' to ' + qm.make_human_readable_date(range_end) range_dict['count'] = solr_count range_dict['oc-api:min-date'] = range_min_key range_dict['oc-api:max-date'] = range_end field['oc-api:has-range-options'].append(range_dict) date_fields.append(field) if len(date_fields) > 0 and 'facet' in self.act_responses: self.json_ld['oc-api:has-date-facets'] = date_fields