marklogic-community / slush-marklogic-node

Slush generator for a MarkLogic/node project
https://github.com/marklogic-community/slush-marklogic-node/wiki
Other
40 stars 28 forks source link

Splitting facets and results back-end calls #544

Open grtjn opened 6 years ago

grtjn commented 6 years ago

Sometimes facets are big, and thus slow. To not have them slow down showing of results, you can make mlSearch do separate calls for them. It requires adding something like this above ctrl.init() in search.controller.js:

    // override internal search to split results and facets call..
    ctrl._search = function() {
      this.searchPending = true;

      // results only
      var promise = this.mlSearch.search({
        'return-results': true,
        'return-facets': false
      })
      .then(this.updateSearchResults.bind(this));

      // facets only
      this.mlSearch.search({
        'return-results': false,
        'return-facets': true
      })
      .then(this.updateSearchResults.bind(this));

      this.updateURLParams();
      return promise;
    };

    // override the updateSearchResults to handle split of results and facets..
    ctrl.updateSearchResults = function updateSearchResults(data) {
      var oldFacets = ctrl.response.facets;
      var oldResults = ctrl.response.results;

      superCtrl.updateSearchResults.apply(ctrl, arguments);

      if (!ctrl.response.facets) {
        ctrl.response.facets = oldFacets;
      } else {
        ctrl.response.results = oldResults;
      }

      return ctrl;
    };
sashamitrovich commented 6 years ago

Good job. As you found out later, need to add this to ctrl.updateSearchResults, too:


      // forcing caching of results for an "ad-hoc" query
      ctrl.mlSearch.results=ctrl.response;