///
///
///
var SearchCriteriaManager = /** @class */ (function () {
function SearchCriteriaManager() {
this.rootFilterComposite = null;
this.displayItems = [];
this.queryCheckTerms = [];
this.fieldLabelLookup = {};
this.apiSearchString = '*:*';
this.searchHash = "#";
this.topicsAdded = {};
this.fieldsAdded = [];
this.listeners = [];
this.rootFilterComposite = new FilterComposite("root");
this.rootFilterComposite.conjunction = FilterConjunction.AND;
}
SearchCriteriaManager.prototype.registerListener = function (listener) {
this.listeners.push(listener);
};
SearchCriteriaManager.prototype.setFromApiSearch = function (search) {
this.displayItems = [];
var converter = new QueryStringConverter();
this.rootFilterComposite = converter.apiSearchToFilterComposite(search);
this.loadFieldLookup(search);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.setFromUiSearchString = function (uiSearchString) {
this.displayItems = [];
var converter = new QueryStringConverter();
this.rootFilterComposite = converter.uiSearchStringToFilterComposite(uiSearchString);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.getSearchAsUiSearchString = function () {
var converter = new QueryStringConverter();
return converter.filterCompositeToUiSearchString(this.rootFilterComposite);
};
SearchCriteriaManager.prototype.clearSearch = function () {
this.rootFilterComposite = new FilterComposite("root");
this.topicsAdded = {};
this.fieldsAdded = [];
this.refreshCriteria();
};
SearchCriteriaManager.prototype.searchIsEmpty = function () {
return this.rootFilterComposite.childFilters.length == 0;
};
SearchCriteriaManager.prototype.serializeSearch = function () {
if (!this.rootFilterComposite)
return '*:*';
if (!this.rootFilterComposite.childFilters || this.rootFilterComposite.childFilters.length == 0)
return "*:*";
return this.rootFilterComposite.serialize();
};
SearchCriteriaManager.prototype.containsClauseFilters = function () {
if (this.rootFilterComposite) {
if (this.rootFilterComposite.containsFilterOnField('clauseType', true))
return true;
if (this.rootFilterComposite.containsFilterOnField('clauseText', true))
return true;
if (this.rootFilterComposite.containsFilterOnField('sectionType', true))
return true;
}
return false;
};
SearchCriteriaManager.prototype.isAnyClauseType = function () {
if (this.rootFilterComposite) {
if (this.rootFilterComposite.containsFilterOnField('clauseText', true)) {
var usedFilters = [];
this.rootFilterComposite.getUsedFilters(usedFilters, true);
for (var _i = 0, usedFilters_1 = usedFilters; _i < usedFilters_1.length; _i++) {
var filter = usedFilters_1[_i];
if (filter.field === "clauseText") { //ClauseText without _nnn is any clause
return true;
}
}
}
}
return false;
};
SearchCriteriaManager.prototype.containsFilterOnField = function (field, oneOnly, values) {
var _this = this;
if (this.rootFilterComposite) {
var allPositiveFilters = new Array();
this.rootFilterComposite.getUsedFilters(allPositiveFilters, true, false);
var filtered = allPositiveFilters.filter(function (filt) { return _this.fieldsMatch(filt.field, field); });
if (filtered.length == 0)
return false;
values = values == null ? [] : values;
if (values.length == 0) {
if (filtered.length == 1)
return true;
if (filtered.length >= 1 && !oneOnly)
return true;
return false;
}
else {
var oneValueMatches = filtered.some(function (f) { return values.some(function (v) { return v == f.value; }); });
return oneValueMatches;
/* for (var i = 0; i < values.length; i++) {
var value = values[i];
for (var j = 0; j < filtered.length; j++) {
var filter = filtered[j];
if (filter.value == value) return true;
}
}*/
}
}
return false;
};
SearchCriteriaManager.prototype.onlyFiltersOnField = function (field) {
var _this = this;
if (this.rootFilterComposite) {
var allFilters = new Array();
this.rootFilterComposite.getUsedFilters(allFilters, true, false);
if (allFilters.length === 0)
return false;
return allFilters.every(function (filt) { return _this.fieldsMatch(filt.field, field); });
}
return false;
};
SearchCriteriaManager.prototype.getPositiveFiltersOnField = function (field) {
var _this = this;
if (!field)
return [];
if (this.rootFilterComposite) {
var allPositiveFilters = new Array();
this.rootFilterComposite.getUsedFilters(allPositiveFilters, true, false);
var filtered = allPositiveFilters.filter(function (filt) { return _this.fieldsMatch(filt.field, field); });
if (filtered.length == 0)
return [];
return filtered;
}
return [];
};
SearchCriteriaManager.prototype.getOrQueryFromFilterList = function (filters) {
if (!(filters && filters.length))
return "";
var tempComp = new FilterComposite("root");
tempComp.conjunction = FilterConjunction.OR;
for (var i = 0; i < filters.length; i++) {
var filter = filters[i];
var tempFilter = new Filter(filter.key, filter.field, filter.value, filter.label);
tempFilter.negative = filter.negative;
tempComp.addFilter(tempFilter);
}
return tempComp.toApiSearchString();
};
SearchCriteriaManager.prototype.loadFieldLookup = function (search) {
this.fieldLabelLookup["year"] = "Year";
if (!(search && search.inclusions))
return;
for (var i = 0; i < search.inclusions.length; i++) {
var incSet = search.inclusions[i];
this.fieldLabelLookup[incSet.name] = incSet.label;
}
};
SearchCriteriaManager.prototype.getDisplayItems = function (composite) {
var elements = [];
if (!composite)
return elements;
for (var i = 0; i < composite.childFilters.length; i++) {
var candidate = composite.childFilters[i];
var displayUnit;
var displayTerm;
var asFilterGroup;
if (candidate instanceof Filter || candidate instanceof FilterGroup) {
displayUnit = new FilterDisplayUnit(candidate.key, candidate.negative);
asFilterGroup = (candidate instanceof FilterGroup) ? candidate : null;
displayTerm = new FilterDisplayTerm(candidate.key, candidate.label, asFilterGroup != null, asFilterGroup ? asFilterGroup.groupType == FilterGroupType.TOPIC : false);
displayUnit.terms.push(displayTerm);
}
else if (candidate instanceof FilterComposite) {
displayUnit = new FilterDisplayUnit(candidate.key, candidate.negative);
for (var j = 0; j < candidate.childFilters.length; j++) {
var filter = candidate.childFilters[j];
//Can only go down one level - i.e. accept only Filters or FilterGroups
if (filter instanceof Filter || filter instanceof FilterGroup) {
asFilterGroup = (candidate instanceof FilterGroup) ? candidate : null;
displayTerm = new FilterDisplayTerm(filter.key, filter.label, asFilterGroup != null, asFilterGroup ? asFilterGroup.groupType == FilterGroupType.TOPIC : false);
displayUnit.terms.push(displayTerm);
displayTerm.parentKey = displayUnit.key;
}
}
}
elements.push(displayUnit);
}
return elements;
};
SearchCriteriaManager.prototype.addFilter = function (field, value, label, negative) {
value = this.modifyValueIfRequired(field, value);
var key = FilterComposite.getNextFilterKey("F");
var filter = new Filter(key, field, value, label);
if (this.validateAddition(filter)) {
this.rootFilterComposite.addFilter(filter);
if (negative && negative == true) {
this.toggleNegative(filter.key);
}
this.refreshCriteria();
}
return filter;
};
SearchCriteriaManager.prototype.addToLikeFilter = function (field, value, label, partialFieldMatch) {
var usedFilters = [];
value = this.modifyValueIfRequired(field, value);
this.rootFilterComposite.getUsedFilters(usedFilters, true, true);
var keyOfLastLikeFilter = null;
for (var i = usedFilters.length - 1; i >= 0; i--) {
var filter = usedFilters[i];
if (this.fieldsMatch(filter.field, field)) {
keyOfLastLikeFilter = filter.key;
break;
}
if (partialFieldMatch) {
if (filter.field.indexOf(partialFieldMatch) > -1) {
keyOfLastLikeFilter = filter.key;
break;
}
}
}
var key = FilterComposite.getNextFilterKey("F");
var newFilter = new Filter(key, field, value, label);
if (this.validateAddition(newFilter)) {
this.rootFilterComposite.addFilter(newFilter);
}
if (keyOfLastLikeFilter) {
this.joinInOr(newFilter.key, keyOfLastLikeFilter);
}
else {
this.refreshCriteria();
}
return newFilter;
};
//e.g. typeFieldName = "clauseType", textFieldPrefix="clauseText", text="volcano"
SearchCriteriaManager.prototype.addClauseTextSearch = function (typeFieldName, textFieldPrefix, text, anyTypeDescription, cleanText) {
var filters = this.getUsedFilters();
this.removeAnyClause(typeFieldName, textFieldPrefix);
if (filters.length > 0) {
for (var i = 0; i < filters.length; i++) {
var ft = filters[i];
//"clauseType"
if (ft.field == typeFieldName) {
for (var j = 0; j < ft.filters.length; j++) {
var f = ft.filters[j];
if (text.length > 0) {
f.field = textFieldPrefix + "_" + f.value;
f.label = "'" + text + "' in " + f.label;
f.value = cleanText;
}
else {
if (ft.field == textFieldPrefix) {
//remove the filter
this.removeFilter(f.key);
}
}
}
}
//"clausetText"
if (ft.field.lastIndexOf(textFieldPrefix, 0) === 0) {
for (var j = 0; j < ft.filters.length; j++) {
var f = ft.filters[j];
if (f.updatedManually)
continue;
if (text.length > 0) {
f.label = f.label.replace(/'.+'/, "'" + text + "'");
f.value = cleanText;
}
else {
//remove the filter
this.removeFilter(f.key);
}
}
}
}
}
else {
//volcano in Any Cause Type
if (text && text.length > 0) {
this.addFilter(textFieldPrefix, cleanText, "'" + text + "' in " + anyTypeDescription, false);
}
}
this.refreshCriteria();
};
// remove "'volcano' in Any Clause type " if there are clauseTypes specified
SearchCriteriaManager.prototype.removeAnyClause = function (typeFieldName, textFieldPrefix) {
var filters = this.getUsedFilters();
if (this.containsFilterOnField(typeFieldName, false, null)) {
for (var i = 0; i < filters.length; i++) {
var ft = filters[i];
if (ft.field == textFieldPrefix) {
var k = ft.filters[0].key;
this.removeFilter(k);
return;
}
}
}
};
SearchCriteriaManager.prototype.fieldsMatch = function (fieldA, fieldB) {
if (fieldA.indexOf('clauseText') > -1 && fieldB.indexOf('clauseText') > -1)
return true;
return fieldA == fieldB;
};
SearchCriteriaManager.prototype.addMultipleFiltersForField = function (field, conjunction, filterValues) {
var compKey = FilterComposite.getNextFilterKey("FC");
var composite = new FilterComposite(compKey);
composite.conjunction = conjunction;
for (var i = 0; i < filterValues.length; i++) {
var value = filterValues[i];
var key = FilterComposite.getNextFilterKey("F");
var filter = new Filter(key, field, value, value);
composite.addFilter(filter);
}
this.rootFilterComposite.addFilter(composite);
this.refreshCriteria();
return composite;
};
SearchCriteriaManager.prototype.addTopic = function (topicId, label, query, inclusions) {
if (this.topicsAdded.hasOwnProperty(topicId.toString()))
return this.topicsAdded[topicId.toString()];
var apiConverter = new ApiToUiFormatConverter();
var uiQuery = apiConverter.convertFromApiSearch({ search: query, inclusions: inclusions });
var converter = new UiFormatToFilterCompositeConverter();
var filterGroup = converter.convertQueryStringToFilterGroup(topicId, uiQuery, label, FilterGroupType.TOPIC);
this.rootFilterComposite.addFilter(filterGroup);
this.topicsAdded[topicId] = filterGroup.key;
this.refreshCriteria();
return filterGroup;
};
SearchCriteriaManager.prototype.addSmartFilter = function (id, field, conjunction, filterValues, label) {
var compKey = FilterComposite.getNextFilterKey("FG");
var filterGroup = new FilterGroup(compKey, id, label, FilterGroupType.SMARTFILTER);
filterGroup.conjunction = conjunction;
for (var i = 0; i < filterValues.length; i++) {
var value = filterValues[i];
var key = FilterComposite.getNextFilterKey("F");
var filter = new Filter(key, field, value, value);
filterGroup.addFilter(filter);
}
this.rootFilterComposite.addFilter(filterGroup);
this.refreshCriteria();
return filterGroup;
};
SearchCriteriaManager.prototype.breakoutTopic = function (filterKey) {
this.removeTopicIdFromStore(filterKey);
this.rootFilterComposite.breakOutFilterGroup(filterKey);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.getUsedFilters = function () {
var usedFilters = [];
if (!this.rootFilterComposite)
return usedFilters;
this.rootFilterComposite.getUsedFilters(usedFilters);
var grouped = {};
var checkDict = {};
for (var i = 0; i < usedFilters.length; i++) {
var filter = usedFilters[i];
var uniqueKey = filter.field + filter.value;
if (!checkDict[uniqueKey]) {
checkDict[uniqueKey] = true;
if (!grouped[filter.field])
grouped[filter.field] = [];
grouped[filter.field].push(filter);
}
}
var distilled = [];
for (var prop in grouped) {
if (grouped.hasOwnProperty(prop)) {
distilled.push({ field: prop, filters: grouped[prop] });
}
}
return distilled;
};
SearchCriteriaManager.prototype.containsSpecificFilter = function (field, value, includeNegatives) {
if (includeNegatives === void 0) { includeNegatives = false; }
return this.rootFilterComposite.containsSpecificFilter(field, value, !includeNegatives);
};
SearchCriteriaManager.prototype.searchContainsTopic = function () {
return this.rootFilterComposite.containsFilterGroupOfType(FilterGroupType.TOPIC);
};
SearchCriteriaManager.prototype.validateAddition = function (filter) {
//validate duplicates
for (var i = 0; i < this.rootFilterComposite.childFilters.length; i++) {
var fil = this.rootFilterComposite.childFilters[i];
if (fil.field == filter.field && fil.value == filter.value) {
return false;
}
}
return true;
};
SearchCriteriaManager.prototype.removeFilter = function (filterKey) {
var filterRemoved = this.rootFilterComposite.removeFilter(filterKey);
if (filterRemoved instanceof FilterGroup)
this.removeTopicIdFromStore(filterRemoved.key);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.removeTopicIdFromStore = function (topicFilterKey) {
var idToRemove = null;
for (var prop in this.topicsAdded) {
if (this.topicsAdded.hasOwnProperty(prop)
&& this.topicsAdded[prop] == topicFilterKey) {
idToRemove = prop;
}
}
if (idToRemove)
delete this.topicsAdded[idToRemove];
};
SearchCriteriaManager.prototype.toggleNegative = function (filterKey) {
this.rootFilterComposite.toggleNegative(filterKey);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.joinInOr = function (filterKey, targetFilterKey) {
this.rootFilterComposite.joinFiltersInOrComposite(filterKey, targetFilterKey);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.removeFromOr = function (filterKey) {
this.rootFilterComposite.removeFilterFromOrComposite(filterKey);
this.refreshCriteria();
};
SearchCriteriaManager.prototype.updateFilterText = function (key, text) {
var f = this.rootFilterComposite.getFilterWithKey(key);
if (f instanceof Filter) {
f.updateText(text);
this.refreshCriteria();
}
};
SearchCriteriaManager.prototype.refreshCriteria = function () {
this.displayItems = this.getDisplayItems(this.rootFilterComposite);
this.queryCheckTerms = this.getQueryCheckerTerms(this.rootFilterComposite);
var converter = new QueryStringConverter();
this.apiSearchString = converter.filterCompositeToApiSearchString(this.rootFilterComposite);
this.searchHash = converter.filterCompositeToUiSearchString(this.rootFilterComposite);
if (this.listeners && this.listeners.length) {
for (var i = 0; i < this.listeners.length; i++) {
var listener = this.listeners[i];
listener.searchCriteriaChanged();
}
}
};
SearchCriteriaManager.prototype.getQueryCheckerTerms = function (filterComposite) {
var usedFilters = [];
var queryCheckFilters = [];
filterComposite.getUsedFilters(usedFilters, false, false);
for (var i = 0; i < usedFilters.length; i++) {
var f = usedFilters[i];
var fieldLabel = this.fieldLabelLookup[f.field];
queryCheckFilters.push(new QueryCheckTerm(f.key, f.label, this.isGrouped(f), false, f.negative || f.parent.negative, f.field, fieldLabel));
}
return queryCheckFilters;
};
SearchCriteriaManager.prototype.isGrouped = function (f) {
if (f.parent instanceof FilterGroup) {
return f.parent.parent.key !== "root";
}
else if (f.parent instanceof FilterComposite) {
return f.parent.key !== "root";
}
return true;
};
SearchCriteriaManager.prototype.findFilterWithValue = function (value) {
return this.findFilterWithValueInFilterComposite(this.rootFilterComposite, value);
};
SearchCriteriaManager.prototype.findFilterWithValueInFilterComposite = function (fc, value) {
for (var i = 0; i < fc.childFilters.length; i++) {
var f = fc.childFilters[i];
if (f instanceof FilterComposite) {
var cf = this.findFilterWithValueInFilterComposite(f, value);
if (cf != null)
return cf;
}
else {
var fil = f;
if (fil.value == value)
return f;
if (fil.field.indexOf("_" + value) == fil.field.length - value.toString().length - 1)
return f;
}
}
return null;
};
SearchCriteriaManager.prototype.modifyValueIfRequired = function (field, value) {
var newValue = this.addBracketsIfRequired(field, value);
newValue = this.escapeSpecialCharacters(field, newValue);
return newValue;
};
SearchCriteriaManager.prototype.addBracketsIfRequired = function (field, value) {
if (typeof value === 'string' && (field === 'text' || field === 'title')) {
return "(" + value + ")";
}
return value;
};
SearchCriteriaManager.prototype.escapeSpecialCharacters = function (field, value) {
if (typeof value === 'string' && (field === 'text' || field === 'title')) {
return value.replace(":", "\\:");
}
return value;
};
return SearchCriteriaManager;
}());
//# sourceMappingURL=SearchCriteriaManager.js.map