blob: 81db3a07f5f4581156cea21584b53039189ae682 [file] [log] [blame]
/*global alasql*/
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Ember from 'ember';
/*
* A wrapper around AlaSQL
*/
export default Ember.Object.extend({
constructQuery: function(clause) {
return `SELECT * FROM ? WHERE ${clause}`;
},
validateClause: function (clause, columns) {
clause = clause.toString();
var query = this.constructQuery(this.normaliseClause(clause, columns || [])),
valid = false;
if(clause.match(/\W/g)) { // If it contain special characters including space
try {
alasql(query, [[{}]]);
valid = true;
}
catch(e) {}
}
return valid;
},
createFacetClause: function (conditions, columns) {
if(conditions && columns) {
return columns.map(function (column) {
if(column.get("facetType")) {
return column.get("facetType.toClause")(column, conditions[Ember.get(column, "id")]);
}
}).filter(clause => clause).join(" AND ");
}
},
normaliseClause: function (clause, columns) {
clause = clause.toString();
columns.forEach(function (column) {
var headerTitle = column.get("headerTitle");
clause = clause.replace(new RegExp(`"${headerTitle}"`, "gi"), column.get("id"));
});
return clause;
},
search: function (clause, rows, columns) {
clause = this.normaliseClause(clause, columns);
// Convert into a form that alasql can digest easily
var dataSet = rows.map(function (row, index) {
var rowObj = {
_index_: index
};
columns.forEach(function (column) {
if(column.get("enableSearch") && row) {
rowObj[column.get("id")] = column.getSearchValue(row);
}
});
return rowObj;
});
// Search
dataSet = alasql(this.constructQuery(clause), [dataSet]);
return dataSet.map(function (data) {
return rows[data._index_];
});
}
});