Browse Source

[search] Smarter date truncation for date filter

Romain Rigaux 10 năm trước cách đây
mục cha
commit
2c4ff6e7b2

+ 13 - 10
apps/search/src/search/templates/search.mako

@@ -119,17 +119,20 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
     <select data-bind="options: $root.availableDateFields, value: collection.timeFilter.field, optionsValue: 'name', visible: $root.isEditing" class="input-medium"></select>
 
     <span data-bind="visible: collection.timeFilter.type() == 'rolling'">
-      <select data-bind="value: collection.timeFilter.value" class="input-small"  style="margin-left:10px">
+      <select data-bind="value: collection.timeFilter.value" class="input-medium"  style="margin-left:10px">
         <option value="all">${ _('All') }</option>
-        <option value="5MINUTES/MINUTES">${ _('Last 5 Minutes') }</option>
-        <option value="15MINUTES/MINUTES">Last 15 Minutes</option>
-        <option value="1HOURS/MINUTES">Last 1 Hour</option>
-        <option value="1DAYS/DAYS">Last day</option>
-        <option value="2DAYS/DAYS">Last 2 days</option>
-        <option value="7DAYS/DAYS">Last Week</option>
-        <option value="6MONTHS/MONTHS">Last 6 Months</option>
-        <option value="1YEARS/YEARS">Last Year</option>
-        <option value="2YEARS/YEARS">Last 2 Years</option>
+        <option value="5MINUTES">${ _('Past 5 Minutes') }</option>
+        <option value="30MINUTES">${ _('Past 30 Minutes') }</option>
+        <option value="1HOURS">${ _('Past 1 Hour') }</option>
+        <option value="12HOURS">${ _('Past 12 Hours') }</option>
+        <option value="1DAYS">${ _('Past day') }</option>
+        <option value="2DAYS">${ _('Past 2 days') }</option>
+        <option value="7DAYS">${ _('Past 7 days') }</option>
+        <option value="1MONTHS">${ _('Past 1 Month') }</option>
+        <option value="3MONTHS">${ _('Past 3 Months') }</option>
+        <option value="1YEARS">${ _('Past Year') }</option>
+        <option value="2YEARS">${ _('Past 2 Years') }</option>
+        <option value="10YEARS">${ _('Past 10 Years') }</option>
       </select>      
     </span>
     

+ 50 - 30
desktop/libs/libsolr/src/libsolr/api.py

@@ -78,37 +78,60 @@ class SolrApi(object):
   def _get_range_borders(self, collection, query):
     props = {}
     GAPS = {
-        '5MINUTES/MINUTES': {
-            'histogram-widget': '+3SECONDS', # 100 slots
-            'facet-widget': '+30SECONDS', # 10 slots
+        '5MINUTES': {
+            'histogram-widget': {'coeff': '+3', 'unit': 'SECONDS'}, # ~100 slots
+            'facet-widget': {'coeff': '+1', 'unit': 'MINUTES'}, # ~10 slots
         },
-        '15MINUTES/MINUTES': {
-            'histogram-widget': '+10SECONDS',
-            'facet-widget': '+90SECONDS',
+        '30MINUTES': {
+            'histogram-widget': {'coeff': '+20', 'unit': 'SECONDS'},
+            'facet-widget': {'coeff': '+5', 'unit': 'MINUTES'},
         },
-        '1HOURS/MINUTES': {
-            'histogram-widget': '+36SECONDS',
-            'facet-widget': '+6MINUTES',
+        '1HOURS': {
+            'histogram-widget': {'coeff': '+30', 'unit': 'SECONDS'},
+            'facet-widget': {'coeff': '+10', 'unit': 'MINUTES'},
         },
-        '1DAYS/DAYS': {
-            'histogram-widget': '+15MINUTES',
-            'facet-widget': '+144MINUTES',
+        '12HOURS': {
+            'histogram-widget': {'coeff': '+7', 'unit': 'MINUTES'},
+            'facet-widget': {'coeff': '+1', 'unit': 'HOURS'},
         },
-        '2DAYS/DAYS': {
-            'histogram-widget': '+30MINUTES',
-            'facet-widget': '+288MINUTES',
+        '1DAYS': {
+            'histogram-widget': {'coeff': '+15', 'unit': 'MINUTES'},
+            'facet-widget': {'coeff': '+3', 'unit': 'HOURS'},
         },
-        '7DAYS/DAYS': {
-            'histogram-widget': '+3HOURS',
-            'facet-widget': '+1008MINUTES',
+        '2DAYS': {
+            'histogram-widget': {'coeff': '+30', 'unit': 'MINUTES'},
+            'facet-widget': {'coeff': '+6', 'unit': 'HOURS'},
+        },
+        '7DAYS': {
+            'histogram-widget': {'coeff': '+3', 'unit': 'HOURS'},
+            'facet-widget': {'coeff': '+1', 'unit': 'DAYS'},
+        },
+        '1MONTHS': {
+            'histogram-widget': {'coeff': '+12', 'unit': 'HOURS'},
+            'facet-widget': {'coeff': '+5', 'unit': 'DAYS'},
+        },
+        '3MONTHS': {
+            'histogram-widget': {'coeff': '+1', 'unit': 'DAYS'},
+            'facet-widget': {'coeff': '+30', 'unit': 'DAYS'},
+        },
+        '1YEARS': {
+            'histogram-widget': {'coeff': '+3', 'unit': 'DAYS'},
+            'facet-widget': {'coeff': '+12', 'unit': 'MONTHS'},
+        },
+        '2YEARS': {
+            'histogram-widget': {'coeff': '+7', 'unit': 'DAYS'},
+            'facet-widget': {'coeff': '+3', 'unit': 'MONTHS'},
+        },
+        '10YEARS': {
+            'histogram-widget': {'coeff': '+1', 'unit': 'MONTHS'},
+            'facet-widget': {'coeff': '+1', 'unit': 'YEARS'},
         }
-        # ...
     }
     fq_fields = [fq['field'] for fq in query['fqs']]
     time_field = collection['timeFilter'].get('field')
 
     # fqs overrides main time filter
-    if time_field and time_field not in fq_fields:
+    if time_field and time_field not in fq_fields or True:
       if collection['timeFilter']['type'] == 'rolling' and collection['timeFilter']['value'] != 'all': # todo all for chart range? guess based on min
         props['field'] = collection['timeFilter']['field']
         props['from'] = 'NOW-%s' % collection['timeFilter']['value']
@@ -208,17 +231,14 @@ class SolrApi(object):
               'gap': facet['properties']['gap'],              
               'mincount': int(facet['properties']['mincount'])
           }
-          
-          # todo round by gap? 
-          
+
           if timeFilter:
-#            if facet['widgetType'] == 'histogram-widget':
-              keys.update({
-                'start': timeFilter['from'],
-                'end': timeFilter['to'],
-                'gap': timeFilter['gap'][facet['widgetType']], # add a 'auto'
-              })
-              print keys
+            gap = timeFilter['gap'][facet['widgetType']]
+            keys.update({
+              'start': '%(from)s/%(unit)s' % {'from': timeFilter['from'], 'unit': gap['unit']},
+              'end': '%(to)s/%(unit)s' % {'to': timeFilter['to'], 'unit': gap['unit']},
+              'gap': '%(coeff)s%(unit)s/%(unit)s' % gap, # add a 'auto'
+            })
 
           params += (
              ('facet.range', '{!key=%(key)s ex=%(id)s f.%(field)s.facet.range.start=%(start)s f.%(field)s.facet.range.end=%(end)s f.%(field)s.facet.range.gap=%(gap)s f.%(field)s.facet.mincount=%(mincount)s}%(field)s' % keys),