UNPKG

solid-panes

Version:

Solid-compatible Panes: applets and views for the mashlib and databrowser

286 lines (273 loc) 10 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports.QuerySource = QuerySource; exports.makeQueryRow = makeQueryRow; exports.viewAndSaveQuery = viewAndSaveQuery; var _solidLogic = require("solid-logic"); var UI = _interopRequireWildcard(require("solid-ui")); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } /* istanbul ignore file */ // The query-by-example functionality in the tabulator // was the ability to expore a bit of the web in outline mode, // select a ceratain set of fields in the tree, // then pres "find all" which would then generte a SPARQL query // to find all other places which had the same pattern. // Fields could be optional by pressing th ewhite optoional button var optionalSubqueriesIndex = []; function predParentOf(node) { var n = node; while (true) { if (n.getAttribute('predTR')) { return n; } else if (n.previousSibling && n.previousSibling.nodeName === 'TR') { n = n.previousSibling; } else { console.log('Could not find predParent'); return node; } } } function makeQueryRow(q, tr, constraint) { // predtr = predParentOf(tr) // var nodes = tr.childNodes // var n = tr.childNodes.length var inverse = tr.AJAR_inverse; // var hasVar = 0 var parentVar, level, pat; function makeRDFStatement(freeVar, parent) { if (inverse) { return new UI.rdf.Statement(freeVar, st.predicate, parent); } else { return new UI.rdf.Statement(parent, st.predicate, freeVar); } } var optionalSubqueryIndex = null; for (level = tr.parentNode; level; level = level.parentNode) { if (typeof level.AJAR_statement !== 'undefined') { // level.AJAR_statement level.setAttribute('bla', level.AJAR_statement); // @@? -timbl // UI.log.debug("Parent TR statement="+level.AJAR_statement + ", var=" + level.AJAR_variable) /* for(let c=0;c<level.parentNode.childNodes.length;c++) //This makes sure the same variable is used for a subject if(level.parentNode.childNodes[c].AJAR_variable) level.AJAR_variable = level.parentNode.childNodes[c].AJAR_variable; */ if (!level.AJAR_variable) { makeQueryRow(q, level); } parentVar = level.AJAR_variable; var predLevel = predParentOf(level); if (predLevel.getAttribute('optionalSubqueriesIndex')) { optionalSubqueryIndex = predLevel.getAttribute('optionalSubqueriesIndex'); pat = optionalSubqueriesIndex[optionalSubqueryIndex]; } break; } } if (!pat) { pat = q.pat; } var predtr = predParentOf(tr); // /////OPTIONAL KLUDGE/////////// var opt = predtr.getAttribute('optional'); if (!opt) { if (optionalSubqueryIndex) { predtr.setAttribute('optionalSubqueriesIndex', optionalSubqueryIndex); } else { predtr.removeAttribute('optionalSubqueriesIndex'); } } if (opt) { var optForm = _solidLogic.store.formula(); optionalSubqueriesIndex.push(optForm); predtr.setAttribute('optionalSubqueriesIndex', optionalSubqueriesIndex.length - 1); pat.optional.push(optForm); pat = optForm; } // ////////////////////////////// var st = tr.AJAR_statement; var constraintVar = tr.AJAR_inverse ? st.subject : st.object; // this is only used for constraints var hasParent = true; if (constraintVar.isBlank && constraint) { window.alert('You cannot constrain a query with a blank node. No constraint will be added.'); } if (!parentVar) { hasParent = false; parentVar = inverse ? st.object : st.subject; // if there is no parents, uses the sub/obj } // UI.log.debug('Initial variable: '+tr.AJAR_variable) var v = tr.AJAR_variable ? tr.AJAR_variable : _solidLogic.store.variable(UI.utils.newVariableName()); q.vars.push(v); v.label = hasParent ? parentVar.label : UI.utils.label(parentVar); v.label += ' ' + UI.utils.predicateLabelForXML(st.predicate, inverse); var pattern = makeRDFStatement(v, parentVar); // alert(pattern) v.label = v.label.slice(0, 1).toUpperCase() + v.label.slice(1); // init cap // See ../rdf/sparql.js // This should only work on literals but doesn't. function ConstraintEqualTo(value) { this.describe = function (varstr) { return varstr + ' = ' + value.toNT(); }; this.test = function (term) { return value.sameTerm(term); }; return this; } if (constraint) { // binds the constrained variable to its selected value pat.constraints[v] = new ConstraintEqualTo(constraintVar); } UI.log.info('Pattern: ' + pattern); pattern.tr = tr; tr.AJAR_pattern = pattern; // Cross-link UI and query line tr.AJAR_variable = v; // UI.log.debug('Final variable: '+tr.AJAR_variable) UI.log.debug('Query pattern: ' + pattern); pat.statements.push(pattern); return v; } // makeQueryRow function saveQuery(selection, qs) { // var qs = outline.qs // @@ var q = new UI.rdf.Query(); var n = selection.length; var i, sel, st, tr; for (i = 0; i < n; i++) { sel = selection[i]; tr = sel.parentNode; st = tr.AJAR_statement; UI.log.debug('Statement ' + st); if (sel.getAttribute('class').indexOf('pred') >= 0) { UI.log.info(' We have a predicate'); makeQueryRow(q, tr); } if (sel.getAttribute('class').indexOf('obj') >= 0) { UI.log.info(' We have an object'); makeQueryRow(q, tr, true); } } qs.addQuery(q); function resetOutliner(pat) { var n = pat.statements.length; var pattern, tr; for (var _i = 0; _i < n; _i++) { pattern = pat.statements[_i]; tr = pattern.tr; // UI.log.debug('tr: ' + tr.AJAR_statement); if (typeof tr !== 'undefined') { tr.AJAR_pattern = null; // TODO: is this == to whats in current version? tr.AJAR_variable = null; } } for (var x in pat.optional) { resetOutliner(pat.optional[x]); } } resetOutliner(q.pat); // NextVariable=0; return q; } // saveQuery // When the user asks for all list of all matching parts of the data // function viewAndSaveQuery(outline, selection) { var qs = outline.qs; UI.log.info('outline.doucment is now ' + outline.document.location); var q = saveQuery(selection, qs); /* if (tabulator.isExtension) { // tabulator.drawInBestView(q) } else */ for (var i = 0; i < qs.listeners.length; i++) { qs.listeners[i].getActiveView().view.drawQuery(q); qs.listeners[i].updateQueryControls(qs.listeners[i].getActiveView()); } } /** * The QuerySource object stores a set of listeners and a set of queries. * It keeps the listeners aware of those queries that the source currently * contains, and it is then up to the listeners to decide what to do with * those queries in terms of displays. * Not used 2010-08 -- TimBL * @class QuerySource * @author jambo */ function QuerySource() { /** * stores all of the queries currently held by this source, * indexed by ID number. */ this.queries = []; /** * stores the listeners for a query object. * @see TabbedContainer */ this.listeners = []; /** * add a Query object to the query source--It will be given an ID number * and a name, if it doesn't already have one. This subsequently adds the * query to all of the listeners the QuerySource knows about. */ this.addQuery = function (q) { var i; if (q.name === null || q.name === '') { q.name = 'Query #' + (this.queries.length + 1); } q.id = this.queries.length; this.queries.push(q); for (i = 0; i < this.listeners.length; i++) { if (this.listeners[i] !== null) { this.listeners[i].addQuery(q); } } }; /** * Remove a Query object from the source. Tells all listeners to also * remove the query. */ this.removeQuery = function (q) { var i; for (i = 0; i < this.listeners.length; i++) { if (this.listeners[i] !== null) { this.listeners[i].removeQuery(q); } } if (this.queries[q.id] !== null) { delete this.queries[q.id]; } }; /** * adds a "Listener" to this QuerySource - that is, an object * which is capable of both adding and removing queries. * Currently, only the TabbedContainer class is added. * also puts all current queries into the listener to be used. */ this.addListener = function (listener) { var i; this.listeners.push(listener); for (i = 0; i < this.queries.length; i++) { if (this.queries[i] !== null) { listener.addQuery(this.queries[i]); } } }; /** * removes listener from the array of listeners, if it exists! Also takes * all of the queries from this source out of the listener. */ this.removeListener = function (listener) { var i; for (i = 0; i < this.queries.length; i++) { if (this.queries[i] !== null) { listener.removeQuery(this.queries[i]); } } for (i = 0; i < this.listeners.length; i++) { if (this.listeners[i] === listener) { delete this.listeners[i]; } } }; } //# sourceMappingURL=queryByExample.js.map