GeoKnow/Jassa-Core

View on GitHub
trash/to-port/facete/QueryUtils.js

Summary

Maintainability
D
1 day
Test Coverage

    ns.QueryUtils = {
        
//      createTripleRdfProperties: function(propertyVar) {
//          var result = new rdf.Triple(propertyVar, vocab.rdf.type, vocab.rdf.Property);
//          return result;
//      },

//      createElementRdfProperties: function(propertyVar) {
//          var triple = this.createTripleRdfProperties(propertyVar);
//          var result = new sparql.ElementTriplesBlock([triple]);
//          return result;
//      },
    
        
        
        createElementsFacet: function(concept, isInverse, facetVar, valueVar) {
            var result = [];
            
            // If the concept is isomorph to (?s ?p ?o , ?s), skip it because we are going to add the same triple
            if(!concept.isSubjectConcept()) {
                var elements = concept.getElements();
                result.push.apply(result, elements);
            }
            
            var s = concept.getVariable();
            var p = facetVar;
            var o = valueVar;
        
            var triples = isInverse
                ? [ new rdf.Triple(o, p, s) ]
                : [ new rdf.Triple(s, p, o) ];
            
            var triplesBlock = new sparql.ElementTriplesBlock(triples);
            
            result.push(triplesBlock);
            
            return result;
        },
    
        /**
         * Select ?facetVar (Count(Distinct(?__o)) As ?countFacetVar) { }
         * 
         */
        createQueryFacetCount: function(concept, facetVar, countFacetVar, isInverse, sampleSize) {
    
            //var facetVar = sparql.Node.v("__p");
            var valueVar = sparql.Node.v("__o");
            var elements = ns.createElementsFacet(concept, isInverse, facetVar, valueVar);
            
            var result = ns.createQueryCount(elements, sampleSize, valueVar, countFacetVar, [facetVar], true);
    
            return result;
        },

        
//      createElementSubQuery: function(elements, limit, offset) {
//          if(limit == null && offset == null) {
//              return elements;
//          }
//          
//          var subQuery = new sparql.Query();
//          
//          var subQueryElements = subQuery.getElements();
//          subQueryElements.push.apply(subQueryElements, elements);
//
//          //subQuery.setResultStar(true);
//          subQuery.setLimit(limit);
//          subQuery.setOffset(offset);
//          
//          var resultElement = new sparql.ElementSubQuery(subQuery);           
//
//          return resultElement;
//      },
            
//          if(groupVars) {
//              for(var i = 0; i < groupVars.length; ++i) {                 
//                  var groupVar = groupVars[i];                    
//                  subQuery.projectVars.add(groupVar);
//                  //subQuery.groupBy.push(groupVar);
//              }
//          }
//          
//          if(variable) {
//              subQuery.projectVars.add(variable);
//          }
//          
//          if(subQuery.projectVars.vars.length === 0) {
//              subQuery.isResultStar = true;
//          }
//          
//          subQuery.limit = limit;
//          
//          result.getElements().push(new sparql.ElementSubQuery(subQuery));            
//          } else {
//              var resultElements = result.getElements();
//              resultElements.push.apply(resultElements, elements);
//          }
//      },

        /**
         * Creates a query with
         * Select (Count(*) As outputVar) {{ Select Distinct ?variable { element } }} 
         * 
         * With group vars it may become Select ?g1 ... ?gn Count(Distinct?s))
         * 
         * ISSUE The limit so far acts as a scan limit - it limits the result rows of the element
         *       But it does not affect the number of resources considered
         * If no variable is given, the query 
         */     
        createQueryCount: function(elements, limit, variable, outputVar, groupVars, useDistinct, options) {

            var exprVar = variable ? new sparql.ExprVar(variable) : null;

            
            var queryPattern;

            var needsSubQuery = limit || useDistinct || (groupVars && groupVars.length > 0); 
            if(needsSubQuery) {

                var subQuery = new sparql.Query();
                var subQueryElements = subQuery.getElements();
                subQueryElements.push.apply(subQueryElements, elements); //element.copySubstitute(function(x) { return x; }));
                
                if(groupVars) {
                    for(var i = 0; i < groupVars.length; ++i) {                 
                        var groupVar = groupVars[i];                    
                        subQuery.getProject().add(groupVar);
                        //subQuery.groupBy.push(groupVar);
                    }
                }
                
                if(variable) {
                    subQuery.getProject().add(variable);
                }
                
                if(subQuery.getProjectVars().length === 0) {
                    subQuery.setResultStar(true);
                }

                subQuery.setDistinct(useDistinct);
                subQuery.setLimit(limit);
                
                queryPattern = new sparql.ElementSubQuery(subQuery);
            } else {
                queryPattern = new sparql.ElementGroup(elements);
            }
                      
                        
            
            var result = new sparql.Query();
            result.setQueryPattern(queryPattern);
            
            if(groupVars) {
                _(groupVars).each(function(groupVar) {
                    result.getProject().add(groupVar);
                    result.getGroupBy().push(new sparql.ExprVar(groupVar));
                });
            }

            result.getProject().add(outputVar, new sparql.E_Count());

            return result;
            
            // Note Virtuoso has a bug that
            // TODO Add the fix to SparqlServiceVirtFix for that
            // Select Count(*) { ... } Limit 1000 will prevent from counting beyond 1000 (the limit should only limit the result set after counting to at most 10000 lines) 

            /*
            var tmp = new sparql.Query();
            tmp.setQueryPattern(new sparql.ElementSubQuery(result));
//            if(variable) {
//                tmp.getProject().add(outputVar);
//            } else {
                tmp.setResultStar(true);
//            }

            return tmp;
//            *
            //return result;

            
            /*
            if(variable) {
                varQuery.getProject().add(variable)
            } else {
                varQuery.setResultStar(true);
            }
            */
            
            
            /*
            else {
                varQuery = new sparql.Query();
                //varQuery.getElements().push(new sparql.ElementSubQuery(subQuery));            

                var varQueryElements = varQuery.getElements();
                varQueryElements.push.apply(varQueryElements, elements);
            }
            */
            
            //result.groupBy.push(outputVar);

            //var elementVarQuery = new sparql.ElementSubQuery(varQuery);
            
            
            
            //exp, new sparql.E_Count(exprVar, useDistinct));
            //ns.applyQueryOptions(result, options);
            
            
            
    //debugger;
            //console.log("Created count query:" + result + " for element " + element);
        },
        
        
        /**
         * Creates a query with Count(Distinct ?variable)) As outputVar for an element.
         * 
         */
        createQueryCountDoesNotWorkWithVirtuoso: function(elements, limit, variable, outputVar, groupVars, useDistinct, options) {
    
            
            var exprVar = variable ? new sparql.ExprVar(variable) : null;
            
            var result = new sparql.Query();
            if(limit) {
                var subQuery = new sparql.Query();
                
                var subQueryElements = subQuery.getElements();
                subQueryElements.push.apply(subQueryElements, elements); //element.copySubstitute(function(x) { return x; }));
    
                if(groupVars) {
                    for(var i = 0; i < groupVars.length; ++i) {                 
                        var groupVar = groupVars[i];                    
                        subQuery.projectVars.add(groupVar);
                        //subQuery.groupBy.push(groupVar);
                    }
                }
                
                if(variable) {
                    subQuery.projectVars.add(variable);
                }
                
                if(subQuery.projectVars.vars.length === 0) {
                    subQuery.setResultStar(true);
                }
                
                subQuery.limit = limit;
                
                result.getElements().push(new sparql.ElementSubQuery(subQuery));            
            } else {
                var resultElements = result.getElements();
                resultElements.push.apply(resultElements, elements);
            }
            
            //result.groupBy.push(outputVar);
            if(groupVars) {
                _(groupVars).each(function(groupVar) {
                    result.getProject().add(groupVar);
                    result.getGroupBy().push(new sparql.ExprVar(groupVar));
                });
            }
            
            result.getProject().add(outputVar, new sparql.E_Count(exprVar, useDistinct));
            //ns.applyQueryOptions(result, options);
            
    //debugger;
            //console.log("Created count query:" + result + " for element " + element);
            return result;
        }
    };