GeoKnow/Jassa-Core

View on GitHub
lib/facete/FacetServiceBuilder.js

Summary

Maintainability
A
2 hrs
Test Coverage
var Class = require('../ext/Class');
var FacetServiceUtils = require('./FacetServiceUtils');

var FacetServiceFn = require('./facet_service/FacetServiceFn');
var FacetServiceClientIndex = require('./facet_service/FacetServiceClientIndex');

var LiteralPreference = require('../sparql/LiteralPreference');
var LookupServiceUtils = require('../sponate/LookupServiceUtils');
var FacetServiceTransformConcept = require('./facet_service/FacetServiceTransformConcept');

var ListServiceTransformItem = require('../service/list_service/ListServiceTransformItem');
var ListServiceTransformItems = require('../service/list_service/ListServiceTransformItems');
var MappedConceptUtils = require('../sponate/MappedConceptUtils');

var LabelUtils = require('../sparql/LabelUtils');
var KeywordSearchUtils = require('../sparql/search/KeywordSearchUtils');

var HashMap = require('../util/collection/HashMap');

var FacetServiceBuilder = Class.create({
   initialize: function(facetService, defaultSparqlService) {
       this.facetService = facetService;
       this.defaultSparqlService = defaultSparqlService;
   },

   create: function() {
       return this.facetService;
   },

   labelConfig: function(literalPreference) {
       literalPreference = literalPreference || new LiteralPreference();

       this.labelConfigLabels(literalPreference);
       this.labelConfigFilter(literalPreference);

       return this;
   },

   tagFn: function(tagFn) {
     this.facetService = new FacetServiceFn(this.facetService, function(listService) {
         var r = new ListServiceTransformItem(listService, tagFn);
         return r;
     });

     return this;
   },


   pathToTags: function(pathToTags, mapAttr) {
       pathToTags = pathToTags || new HashMap();
       mapAttr = mapAttr || 'tags';

       this.facetService = new FacetServiceFn(this.facetService, function(listService) {
           var r = new ListServiceTransformItems(listService, function(entries) {
               entries.forEach(function(entry) {
                   var val = entry.val;
                   var path = val.path;

                   var tags = pathToTags.get(path);
                   if(!tags) {
                       tags = {};
                       pathToTags.put(path, tags);
                   }
                   val[mapAttr] = tags;
               });

               return entries;
           });
           return r;
       });

       return this;
   },

//   labelLookupService: function(lookupServiceNodeLabel) {
//
//   },

   labelConfigFilter: function(literalPreference) {
       // TODO: Make the search function configurable
       var fnTransformSearch = function(searchString) {
           var r;
           if(searchString) {

               var relation = LabelUtils.createRelationLiteralPreference(literalPreference);
               // TODO Make it configurable to whether scan URIs too (the true argument)
               r = KeywordSearchUtils.createConceptRegex(relation, searchString, true);
               //var result = sparql.KeywordSearchUtils.createConceptBifContains(relation, searchString);
           } else {
               r = null;
           }

           return r;
       };

       this.facetService = new FacetServiceTransformConcept(this.facetService, fnTransformSearch);
       return this;
   },

   labelConfigLabels: function(literalPreference, labelAttrName) {
       labelAttrName = labelAttrName || 'labelInfo';
       var self = this;

       this.facetService = new FacetServiceFn(this.facetService, function(listService) {

           var r = new ListServiceTransformItems(listService, function(entries) {

               var mappedConcept = MappedConceptUtils.createMappedConceptLiteralPreference(literalPreference);
               var lookupServiceNodeLabels = LookupServiceUtils.createLookupServiceMappedConcept(self.defaultSparqlService, mappedConcept);

               var properties = entries.map(function(entry) {
                   return entry.val.property;
               });

               //console.log('Properties: ' + JSON.stringify(properties));

               var s = lookupServiceNodeLabels.lookup(properties).then(function(map) {
                   entries.forEach(function(entry) {
                       entry.val[labelAttrName] = map.get(entry.val.property);
                   });

                   return entries;
               });

               return s;
           });

           return r;
       });

       return this;
   },

   // NOTE: A label config must already have been provided before calling this function
   index: function() {
       var filterSupplierFn = function(searchString) {
           var result;

           if(searchString != null) {
               var re = new RegExp(searchString, 'mi');

               result = function(entry) {
                   //var key = entry.key;
                   //var labelInfo = fnLabelInfo(key);
                   var labelInfo = entry.val.labelInfo || { id: entry.key.getUri(), displayLabel: entry.key.getUri(), hiddenLabels: []};
//console.log('labelInfo' + JSON.stringify(entry));
                   var m1 = re.test(labelInfo.id);
                   var m2 = m1 || re.test(labelInfo.displayLabel);
                   var m3 = m2 || (labelInfo.hiddenLabels && labelInfo.hiddenLabels.some(function(x) { return re.test(x); }));

                   return m3;
               };
           } else {
               result = function(entry) { return true; };
           }

           return result;
       };

       this.facetService = new FacetServiceClientIndex(this.facetService, filterSupplierFn, 100);

       return this;
   }


});

FacetServiceBuilder.core = function(sparqlService, facetConfig) {
    var facetService = FacetServiceUtils.createFacetService(sparqlService, facetConfig);
    var result = new FacetServiceBuilder(facetService, sparqlService);
    return result;
};

module.exports = FacetServiceBuilder;