Browse Source

HUE-2981 [search] Detect and enable nested documents when they are in the collection

Romain Rigaux 9 năm trước cách đây
mục cha
commit
b972da5

+ 15 - 1
apps/search/src/search/static/search/js/search.ko.js

@@ -1020,7 +1020,7 @@ var Collection = function (vm, collection) {
     }
   });
 
-  self.switchCollection = function() { // Long term would be to reload the page
+  self.switchCollection = function() {
     $.post("/search/get_collection", {
         name: self.name()
     }, function (data) {
@@ -1103,6 +1103,20 @@ var Collection = function (vm, collection) {
           syncArray(self.fields, data.fields, true);
         }
     }).fail(function (xhr, textStatus, errorThrown) {});
+
+    if (vm.isLatest()) {
+      self.getNestedDocuments();
+    }
+  };
+
+  self.getNestedDocuments = function () {
+    $.post("/search/index/fields/nested_documents", {
+        collection: ko.mapping.toJSON(self),
+      }, function (data) {
+        if (data.status == 0) {
+          self.nested.enabled(data.has_nested_documents);
+        }
+    }).fail(function (xhr, textStatus, errorThrown) {});
   };
 
   self.toggleSortColumnGridLayout = function (template_field) {

+ 16 - 0
apps/search/src/search/templates/common_search.mako

@@ -96,6 +96,8 @@ from django.utils.translation import ugettext as _
     <select data-bind="options: $root.availableDateFields, value: collection.timeFilter.field, optionsValue: 'name', visible: $root.isEditing() && $root.availableDateFields().length > 0" class="input-medium" style="margin-left: 4px"></select>
     <span class="time-filter" data-bind="template: {name: 'time-filter'}, visible: collection.timeFilter.type() == 'rolling'"></span>
     <span class="time-fixed-filter" data-bind="template: {name: 'time-fixed-filter'}, visible: collection.timeFilter.type() == 'fixed'"></span>
+
+    <span data-bind="template: {name: 'nested-document-filter'}"></span>
   </form>
 
   <form class="form-search" style="margin: 0" data-bind="submit: searchBtn, visible: columns().length != 0">
@@ -125,6 +127,8 @@ from django.utils.translation import ugettext as _
     </div>
     <span class="time-filter" data-bind="template: {name: 'time-filter'}, visible: collection.timeFilter.type() == 'rolling'"></span>
     <span class="time-fixed-filter" data-bind="template: {name: 'time-fixed-filter'}, visible: collection.timeFilter.type() == 'fixed'"></span>
+
+    <span data-bind="template: {name: 'nested-document-filter'}"></span>
   </form>
 </div>
 %endif
@@ -2544,6 +2548,18 @@ ${ dashboard.layout_skeleton() }
   <div><a class="pointer demi-modal-chevron" data-dismiss="modal"><i class="fa fa-chevron-up"></i></a></div>
 </div>
 
+
+<script type="text/html" id="nested-document-filter">
+  <!-- ko if: $root.isLatest -->
+  <span data-bind="visible: $root.collection.nested.enabled" >
+    <a class="btn pointer" title="${ _('Nested schema') }" rel="tooltip" data-placement="bottom" data-toggle="modal" data-target="#settingsDemiModal">
+      <i class="fa fa-sitemap"></i>
+    </a>
+  </span>
+  <!-- /ko -->
+</script>
+
+
 <div id="fieldAnalysis" class="popover mega-popover right">
   <div class="arrow"></div>
   <h3 class="popover-title" style="text-align: left">

+ 1 - 0
apps/search/src/search/urls.py

@@ -33,6 +33,7 @@ urlpatterns = patterns('search.views',
   # Search
   url(r'^suggest/$', 'query_suggest', name='query_suggest'),
   url(r'^index/fields/dynamic$', 'index_fields_dynamic', name='index_fields_dynamic'),
+  url(r'^index/fields/nested_documents', 'nested_documents', name='nested_documents'),
   url(r'^template/new_facet$', 'new_facet', name='new_facet'),
   url(r'^get_document$', 'get_document', name='get_document'),
   url(r'^update_document$', 'update_document', name='update_document'),

+ 19 - 0
apps/search/src/search/views.py

@@ -338,6 +338,25 @@ def index_fields_dynamic(request):
   return JsonResponse(result)
 
 
+def nested_documents(request):
+  result = {'status': -1, 'message': 'Error'}
+
+  response = {}
+
+  collection = json.loads(request.POST.get('collection', '{}'))
+  query = {'qs': [{'q': '_root_:*'}], 'fqs': [], 'start': 0, 'limit': 0}
+
+  try:
+    response = SolrApi(SOLR_URL.get(), request.user).query(collection, query)
+    result['has_nested_documents'] = response['response']['numFound'] > 0
+    result['status'] = 0
+  except Exception, e:
+    LOG.exception('Failed to list nested documents')
+    result['message'] = force_unicode(e)
+
+  return JsonResponse(result)
+
+
 @allow_viewer_only
 def get_document(request):
   result = {'status': -1, 'message': 'Error'}