comparison query_builder/querybuild.html @ 34:4bbb832c53ac

Completed: Base functionality for simple examples. Minus button now removes all filters for simplicity. Still need to adjust how to go about restarting the querying process once a result has been selected from the display list (eg. the 'selected object is:' case). Also need to strip out a bunch of unneeded code.
author arussell
date Sat, 19 Dec 2015 23:25:23 -0500
parents acc60a20582c
children
comparison
equal deleted inserted replaced
33:758a5313baf4 34:4bbb832c53ac
53 <select class="selected-object form-control"> 53 <select class="selected-object form-control">
54 <option selected>Object type : </option> 54 <option selected>Object type : </option>
55 </select> 55 </select>
56 </div> 56 </div>
57 <div class="col-sm-4 col-md-4" id="select-col2"> 57 <div class="col-sm-4 col-md-4" id="select-col2">
58 <select class="select-object1 form-control"> 58 <select class="select-object1 form-control" id="startselect">
59 <option selected>TEXT</option> 59 <option disable selected></option>
60 <option>TEXT</option>
60 <option>WITNESS</option> 61 <option>WITNESS</option>
61 <option>PERSON</option> 62 <option>PERSON</option>
62 <option>CODEX</option> 63 <option>CODEX</option>
63 <option>PLACE</option> 64 <option>PLACE</option>
64 <option>REPOSITORY</option> 65 <option>REPOSITORY</option>
107 <script type="text/javascript" class="js-code-data-array"> 108 <script type="text/javascript" class="js-code-data-array">
108 //var queryData = []; 109 //var queryData = [];
109 110
110 // Defining initial variables and helper functions 111 // Defining initial variables and helper functions
111 var sourceType = "TEXT"; 112 var sourceType = "TEXT";
113 var currentQueryData;
112 var targets = []; 114 var targets = [];
113 var targetTypes = []; 115 var targetTypes = [];
114 var targetObj = []; // The current objects on the display box 116 var targetObj = [{}]; // The current objects on the display box
115 var numFilters = 1; 117 var numFilters = 1;
116 var filters = [ 118 var filters = [
117 { id: 0, text: 'has relation' }, 119 { id: 0, text: 'has relation' },
118 { id: 1, text: 'attribute' } 120 { id: 1, text: 'attribute' }
119 ]; 121 ];
181 $(".filter-box"+numFilters).select2({ 183 $(".filter-box"+numFilters).select2({
182 data: filters, 184 data: filters,
183 minimumResultsForSearch: Infinity 185 minimumResultsForSearch: Infinity
184 }); 186 });
185 }); 187 });
188 // TODO: update minus button to alter the currRel currAttr arrays
186 $("#minus_filter_button").click(function() { 189 $("#minus_filter_button").click(function() {
187 console.log("minus filter"); 190 console.log("minus filter");
188 $("#row"+numFilters).remove(); 191 //$("#row"+numFilters).remove();
189 numFilters--; 192 //numFilters--;
193
194 // NOTE: Temporary solution for removing filters,
195 while (numFilters > 0) {
196 $("#row"+numFilters).remove();
197 numFilters--;
198 }
199 numFilters++;
200 $("#filters").append(filter_html(numFilters));
201 $(".filter-box"+numFilters).select2({
202 data: filters,
203 minimumResultsForSearch: Infinity
204 });
205 currAttrs = [];
206 currRels = [];
207 currSource = sourceType;
208
209
190 }); 210 });
191 $("#results-container").dblclick(function() { 211 $("#results-container").dblclick(function() {
192 var displayChoice = $("#results-container").find("option:selected").text(); 212 var displayChoice = $("#results-container").find("option:selected").text();
193 console.log(displayChoice + "........."); 213 console.log(targetObj);
194 var selection; 214 if (!targetObj[displayChoice]) {
195 215 // increase tolerance
196 _.map(targetObj, function(obj){ 216 console.log("increase listTolerance");
197 217 listTolerance = 100000;
198 if (_.values(_.values(targetObj))[1] === displayChoice) { 218 process_display_results(currentQueryData);
199 selection = (_.values(_.values(obj))[0])[1]; 219 listTolerance = 100;
200 } 220 }
201 else { 221 else {
202 selection = (_.values(_.values(obj))[0])[0]; 222 console.log(displayChoice + ".........");
203 } 223 var displayType = targetObj[displayChoice];
204 }); 224 /*
205 numFilters++; 225 _.map(targetObj, function(obj){
206 $("#filters").append(select_html(selection, numFilters)); 226
207 // Generate inner relation list 227 if (_.values(_.values(targetObj))[1] === displayChoice) {
208 //genRelations(sourceType, ".constraint-box"+numFilters); 228 selection = (_.values(_.values(obj))[0])[1];
209 sourceType = selection; 229 }
210 console.log("add filter"); 230 else {
231 selection = (_.values(_.values(obj))[0])[0];
232 }
233 });
234 */
235 numFilters++;
236 $("#filters").append(select_html(displayChoice, numFilters));
237 // Generate inner relation list
238 //genRelations(sourceType, ".constraint-box"+numFilters);
239 sourceType = displayChoice;
240 console.log("New Target");
241 genResults("New Target", [displayType,displayChoice], "target")
242 }
211 }); 243 });
212 $(function() { 244 $(function() {
213 $("input").submit(function(event, data) { 245 $("input").submit(function(event, data) {
214 console.log($('.form-control').find("option:selected").text()); 246 console.log($('.form-control').find("option:selected").text());
215 console.log(event); 247 console.log(event);
298 var query = "match (source:"+sourceNodeType+")-[rel]-target return distinct rel.type"; 330 var query = "match (source:"+sourceNodeType+")-[rel]-target return distinct rel.type";
299 console.log("QUERY TYPE IS RELATION NOW"); 331 console.log("QUERY TYPE IS RELATION NOW");
300 currentQueryType = "relation"; 332 currentQueryType = "relation";
301 ajax1(query, constraintBox); 333 ajax1(query, constraintBox);
302 } 334 }
335
303 function genAttributes(sourceNodeType, constraintBox) { 336 function genAttributes(sourceNodeType, constraintBox) {
304 console.log("GENERATE ALL ATTRIBUTES"); 337 console.log("GENERATE ALL ATTRIBUTES");
305 var query = "match (n:"+sourceNodeType+") with keys(n) as collection unwind collection as attributes return distinct attributes"; 338 var query = "match (n:"+sourceNodeType+") with keys(n) as collection unwind collection as attributes return distinct attributes";
306 ajax1(query, constraintBox); 339 ajax1(query, constraintBox);
307 } 340 }
341
308 function genResults(sourceNodeType, selected, constraintBox) { 342 function genResults(sourceNodeType, selected, constraintBox) {
309 // TODO: Return first the list of current values of the display box 343 // TODO: Return first the list of current values of the display box
310 344
311 if (selected === "New Source") { 345 if (selected === "New Source") {
312 console.log("NEW SOURCE - UPDATE RESULTS"); 346 console.log("NEW SOURCE - UPDATE RESULTS");
313 var query = "match (source:"+sourceNodeType+") return source._n_label, source.type"; 347 var query = "match (source:"+sourceNodeType+") return source._n_label, source.type";
348 set_current_query('source', sourceNodeType+")");
349 }
350 else if (sourceNodeType === "New Target") {
351 newTarget = 1;
352 set_current_query('target', selected);
353 var query = get_current_query;
314 } 354 }
315 else if (currentQueryType === "attribute") { 355 else if (currentQueryType === "attribute") {
316 console.log("ATTR CHANGE - UPDATE RESULTS"); 356 console.log("ATTR CHANGE - UPDATE RESULTS");
317 console.log("before update currentQueryAttr is " + currentQueryAttr); 357 console.log("before update currentQueryAttr is " + currentQueryAttr);
318 var qAttr = currentQueryAttr; 358 var qAttr = currentQueryAttr;
319 var query = "match (source:"+sourceNodeType+") where "+get_result_labels()+" AND source."+qAttr+"=~\"(?i).*"+selected+".*\" return distinct source._n_label, source.type limit 5"; 359 set_current_query('attribute', "."+qAttr+"=~\"(?i).*"+selected+".*\"");
360 // this might cause an issue
361 var query = get_current_query();
362 }
363 /*
364 var query = "match (source:"+sourceNodeType+") where ";
365 if (get_result_labels()) query += get_result_labels() + " AND ";
366 query += "source."+qAttr+"=~\"(?i).*"+selected+".*\" return distinct source._n_label, source.type limit 5";
367 // TODO: case where all attributes are searched
368 // if (selected === "ALL") set_current_query('attribute', "."+qAttr+"=~\"(?i).*"+selected+".*\"");
369
320 console.log(query); 370 console.log(query);
321 } 371 */
322 else if (currentQueryType === "relation") { 372 else if (currentQueryType === "relation") {
323 var query = "match (source:" + sourceNodeType + ")-[rel:" + selected + "]->(target) return distinct target._n_label, target.type"; 373 var query = "match (source:" + sourceNodeType + ")-[rel:" + selected + "]->(target) return distinct target._n_label, target.type";
324 console.log("REL CHANGE - UPDATE RESULTS"); 374 console.log("REL CHANGE - UPDATE RESULTS");
375 set_current_query('relation', selected+"]->(");
325 } 376 }
326 else { 377 else {
327 console.log("GENRESULTS IMPROPERLY CALLED"); 378 console.log("GENRESULTS IMPROPERLY CALLED");
328 return; 379 return;
329 } 380 }
343 } 394 }
344 resultLabelString += ")" 395 resultLabelString += ")"
345 } 396 }
346 // to use contains 397 // to use contains
347 // TODO: start n = node(*) where n.Name =~ '.*SUBSTRING.*' return n.Name, n; 398 // TODO: start n = node(*) where n.Name =~ '.*SUBSTRING.*' return n.Name, n;
399
400 var currSource = [sourceType];
401 var currRels = [];
402 var currAttrs = [];
403 var currQ = '';
404
405 function set_current_query(type, q) {
406 if (type === 'source') {
407 currSource[0] = ("match (source:"+q);
408 }
409 else if (type === 'target') {
410 currSource.push("match (target:"+q[0]+")");
411 currRels = [];
412 currAttrs = [];
413 currAttrs.push("target._n_label=\""+q[1]+"\"");
414 }
415 else if (type === 'relation') {
416 currRels.push("-[rel"+currRels.length+":"+q+"target"+currRels.length+")");
417 }
418 else if (type === 'attribute') {
419 if (Boolean(currRels.length)) currAttrs.push("target"+(currRels.length-1)+q);
420 else currAttrs.push("source"+q);
421 }
422 else if (type === 'return') {
423 return currQ
424 }
425 else {
426 console.log("improper call to change current query");
427 }
428 }
429 var newTarget = -1;
430 function get_current_query() {
431 var currQ = currSource[currSource.length-1];
432 var i;
433 var n=currRels.length;
434 var m=currAttrs.length;
435 for (i=0; i<n; i++) {
436 currQ += currRels[i];
437 }
438 currQ += " where ";
439 for (i=0; i<m; i++) {
440 if (Boolean(i)) {
441 currQ += "AND ";
442 }
443 currQ += currAttrs[i]+" ";
444 }
445 if (Boolean(currRels.length)) {
446 currQ += "return distinct target"+(currRels.length-1)+"._n_label, target"+(currRels.length-1)+".type";
447 }
448 else if (newTarget > 0) {
449 currQ += "return distinct target._n_label, target.type";
450 newTarget = -1;
451 }
452 else currQ += "return distinct source._n_label, source.type";
453 console.log(currQ);
454 return currQ;
455 }
456
457
348 458
349 459
350 460
351 // Ajax request function 461 // Ajax request function
352 function ajax1(q, resBox) { 462 function ajax1(q, resBox) {
397 // On success, generate new data 507 // On success, generate new data
398 // TODO: might want to just always return nodes and then deal with the queryData different for each type of return 508 // TODO: might want to just always return nodes and then deal with the queryData different for each type of return
399 function dataGen(dataArr, resBox) { 509 function dataGen(dataArr, resBox) {
400 var d = dataArr; 510 var d = dataArr;
401 targets = []; 511 targets = [];
512 targetObj = [];
402 513
403 // Consider implementing localStorage to avoid reloading every time 514 // Consider implementing localStorage to avoid reloading every time
404 var queryData = []; 515 var queryData = [];
405 for (var i= 0; i<d.length; i++) { 516 for (var i= 0; i<d.length; i++) {
406 var j = d[i]; 517 var j = d[i];
407 queryData.push({ id: j, text: j[0] }); 518 queryData.push({ id: j, text: j[0] });
408 targets.push(j[1]); 519 targets.push(j[1]);
409 } 520 targetObj[j[0]]=j[1];
521 }
522 console.log(queryData);
410 // Now that queryData array has been defined we will sort it by its label value and initialize the option. 523 // Now that queryData array has been defined we will sort it by its label value and initialize the option.
411 queryData.sort(function(a,b){ 524 queryData.sort(function(a,b){
412 var c = a.text.replace(/<|>/g, ''); 525 var c = a.text.replace(/<|>/g, '');
413 var d = b.text.replace(/<|>/g, ''); 526 var d = b.text.replace(/<|>/g, '');
414 return c.localeCompare(d); 527 return c.localeCompare(d);
416 529
417 // Change the displayed results 530 // Change the displayed results
418 if (resBox === "results-container") { 531 if (resBox === "results-container") {
419 process_display_results(queryData); 532 process_display_results(queryData);
420 } 533 }
534 if (resBox === "target") {
535 sourceType = currSource[0];
536 }
421 // Or fill any select boxes 537 // Or fill any select boxes
422 else { 538 else {
423 $(resBox).select2({ 539 $(resBox).select2({
424 data: queryData 540 data: queryData
425 }); 541 });
426 } 542 }
427 } 543 }
428 function process_display_results(queryData) { 544 function process_display_results(queryData) {
545 currentQueryData = queryData;
429 var weights = []; 546 var weights = [];
430 var resultLength = queryData.length; 547 var resultLength = queryData.length;
431 targetTypes = []; 548 targetTypes = [];
432 targetObj = queryData;
433 set_result_labels(queryData); 549 set_result_labels(queryData);
434 $('#results-container') 550 $('#results-container')
435 .find('option') 551 .find('option')
436 .remove() 552 .remove()
437 .end() 553 .end()