GeoKnow/Jassa-Core

View on GitHub
lib/sparql/VarUtils.js

Summary

Maintainability
A
1 hr
Test Coverage
var GenSym = require('./GenSym');
var GeneratorBlacklist = require('./GeneratorBlacklist');
var VarGen = require('./VarGen');
var NodeFactory = require('../rdf/NodeFactory');
var StringUtils = require('../util/StringUtils');

var VarUtils = {
    // Some conveniently predefined variables
    g: NodeFactory.createVar('g'),
    s: NodeFactory.createVar('s'),
    p: NodeFactory.createVar('p'),
    o: NodeFactory.createVar('o'),

    _s_: NodeFactory.createVar('_s_'),
    _p_: NodeFactory.createVar('_p_'),
    _o_: NodeFactory.createVar('_o_'),

    v: NodeFactory.createVar('v'),
    w: NodeFactory.createVar('w'),
    x: NodeFactory.createVar('x'),
    y: NodeFactory.createVar('y'),
    z: NodeFactory.createVar('z'),

    a: NodeFactory.createVar('a'),
    b: NodeFactory.createVar('b'),
    c: NodeFactory.createVar('c'),


    /**
     * Convert an array of variable names to variable objects
     *
     */
    createVars: function(varNames) {
        var result = varNames.map(function(varName) {
            return NodeFactory.createVar(varName);
        });

        return result;
    },

    getVarName: function(v) {
        return v.getName();
    },

    /**
     * Convert an array of variable objects into an array of variable names
     *
     *
     */
    getVarNames: function(vars) {
        var result = vars.map(function(v) {
            return v.getName();
        });

        return result;
    },

    /**
     * Create a generator which yields fresh variables that is not contained in the array 'vars'.
     * The new var name will have the given prefix
     *
     */
    createVarGen: function(prefix, excludeVars) {
        if (!prefix) {
            prefix = 'v';
        }

        var excludeVarNames = this.getVarNames(excludeVars);
        var generator = GenSym.create(prefix);
        var genVarName = new GeneratorBlacklist(generator, excludeVarNames);

        var result = new VarGen(genVarName);

        return result;
    },

    varPattern: /\?(\w+)/g,

    /**
     * Extract SPARQL variables from a string
     *
     * @param {String} str
     * @returns {Array}
     */
    extractSparqlVars: function(str) {
        var varNames = StringUtils.extractAllRegexMatches(this.varPattern, str, 1);
        var result = [];
        for (var i = 0; i < varNames.length; ++i) {
            var varName = varNames[i];
            var v = NodeFactory.createVar(varName);
            result.push(v);
        }

        return result;
    },

    /**
     * Create a generator for fresh variable names
     *
     */
    freshVarGen: function(baseVarName, blacklistVars) {
        var blacklistNames = VarUtils.getVarNames(blacklistVars);

        var genSym = GenSym.create(baseVarName);
        var genFreshName = new GeneratorBlacklist(genSym, blacklistNames);
        var result = new VarGen(genFreshName);

        return result;
    },

    /**
     * Allocate a single fresh variable
     */
    freshVar: function(baseVarName, blacklistVars) {
        var varGen = this.freshVarGen(baseVarName, blacklistVars);
        var result = varGen.next();
        return result;
    },

    // TODO Maybe add a freshVarName method

    fnSubst: function(varMap) {
        var result = function(v) {
            var r = varMap.get(v); // [v.getName()];
            return r;
        };

        return result;
    },

};

module.exports = VarUtils;