|
399 | 399 | }); |
400 | 400 | }; |
401 | 401 |
|
| 402 | + Query.collectParamsFromQueryString = function($location, query) { |
| 403 | + var parameterNames = query.getParameters(); |
| 404 | + var parameters = {}; |
| 405 | + |
| 406 | + var queryString = $location.search(); |
| 407 | + _.each(parameterNames, function(param, i) { |
| 408 | + var qsName = "p_" + param; |
| 409 | + if (qsName in queryString) { |
| 410 | + parameters[param] = queryString[qsName]; |
| 411 | + } |
| 412 | + }); |
| 413 | + |
| 414 | + return parameters; |
| 415 | + }; |
| 416 | + |
402 | 417 | Query.prototype.getSourceLink = function () { |
403 | 418 | return '/queries/' + this.id + '/source'; |
404 | 419 | }; |
405 | 420 |
|
406 | | - Query.prototype.getQueryResult = function (ttl) { |
| 421 | + Query.prototype.getQueryResult = function (ttl, parameters) { |
407 | 422 | if (ttl == undefined) { |
408 | 423 | ttl = this.ttl; |
409 | 424 | } |
410 | 425 |
|
| 426 | + var queryText = this.query; |
| 427 | + |
| 428 | + var queryParameters = this.getParameters(); |
| 429 | + var paramsRequired = !_.isEmpty(queryParameters); |
| 430 | + |
| 431 | + var missingParams = parameters === undefined ? queryParameters : _.difference(queryParameters, _.keys(parameters)); |
| 432 | + |
| 433 | + if (paramsRequired && missingParams.length > 0) { |
| 434 | + var paramsWord = "parameter"; |
| 435 | + if (missingParams.length > 1) { |
| 436 | + paramsWord = "parameters"; |
| 437 | + } |
| 438 | + |
| 439 | + return new QueryResult({job: {error: "Missing values for " + missingParams.join(', ') + " "+paramsWord+".", status: 4}}); |
| 440 | + } |
| 441 | + |
| 442 | + if (parameters !== undefined) { |
| 443 | + queryText = Mustache.render(queryText, parameters); |
| 444 | + |
| 445 | + // Need to clear latest results, to make sure we don't used results for different params. |
| 446 | + this.latest_query_data = null; |
| 447 | + this.latest_query_data_id = null; |
| 448 | + } |
| 449 | + |
411 | 450 | if (this.latest_query_data && ttl != 0) { |
412 | 451 | if (!this.queryResult) { |
413 | 452 | this.queryResult = new QueryResult({'query_result': this.latest_query_data}); |
|
417 | 456 | this.queryResult = QueryResult.getById(this.latest_query_data_id); |
418 | 457 | } |
419 | 458 | } else if (this.data_source_id) { |
420 | | - this.queryResult = QueryResult.get(this.data_source_id, this.query, ttl); |
| 459 | + this.queryResult = QueryResult.get(this.data_source_id, queryText, ttl); |
421 | 460 | } |
422 | 461 |
|
423 | 462 | return this.queryResult; |
424 | 463 | }; |
425 | 464 |
|
426 | 465 | Query.prototype.getQueryResultPromise = function() { |
427 | 466 | return this.getQueryResult().toPromise(); |
| 467 | + }; |
| 468 | + |
| 469 | + Query.prototype.getParameters = function() { |
| 470 | + var parts = Mustache.parse(this.query); |
| 471 | + var parameters = []; |
| 472 | + _.each(parts, function(part) { |
| 473 | + if (part[0] == 'name') { |
| 474 | + parameters.push(part[1]); |
| 475 | + } |
| 476 | + }); |
| 477 | + |
| 478 | + return parameters; |
428 | 479 | } |
429 | 480 |
|
430 | 481 | return Query; |
|
0 commit comments