@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
69 lines • 8.98 kB
JavaScript
import { Operator } from './operator';
import { Query } from '../query/query';
import { Operators } from './operators';
/**
* An operator that can be used on any field and matches entries with null or empty string values.
*
* Beware that if any additional constraints should be applied to the generated query the results may behave strangely.
* Consult the [createQueryWithConstraint()]{@link IsNull#createQueryWithConstraint} method for more information.
*/
export class IsNull extends Operator {
constructor() {
super(0);
}
/**
* @param elasticKeywords the queried fields
* @returns Generates a query that matches null fields and fields with empty string values.
*/
createQuery(elasticKeywords) {
return Operator.forEachKeyword(elasticKeywords, keyword => new Query(`(${this.nullQueryString(keyword)}OR${this.emptyStringQueryString(keyword)})`));
}
/**
* Counterintuitively elasticsearch query string queries behave weirdly when combining the queries with operators such as `AND`.
* Because of this the following query:
*
* (dataSet.text_0.value:"")
*
* returns an empty result set.
*
* But query that should be intuitively more constraining:
*
* (dataSet.text_0.value:"") AND (processId:600168ccf68fea5241ae5e62)
*
* will return a non empty and expected result.
*
* This method exists to combat this issue and add the, sometimes necessary, constraint into the query generated by this operator.
*
* @param elasticKeywords the queried fields
* @param constraint a constraining query that is distributively applied into the query generated by this operator.
* If an empty query is provided the result will be the same as calling [createQuery()]{@link IsNull#createQuery}.
* @returns a query with distributively applied constraint query
*/
createQueryWithConstraint(elasticKeywords, constraint) {
if (constraint.isEmpty) {
return this.createQuery(elasticKeywords);
}
return Operator.forEachKeyword(elasticKeywords, keyword => new Query(`((${this.nullQueryString(keyword)}AND${constraint.value})OR(${this.emptyStringQueryString(keyword)}AND${constraint.value}))`));
}
/**
* @param elasticKeyword the queried field
* @returns a string representation of the query that checks whether the field is null
*/
nullQueryString(elasticKeyword) {
return `(!(_exists_:${elasticKeyword}))`;
}
/**
* @param elasticKeyword the queried field
* @returns a string representation of the query that checks whether the field has an empty string value
*/
emptyStringQueryString(elasticKeyword) {
return `(${elasticKeyword}:"")`;
}
getOperatorNameTemplate() {
return ['search.operator.isNull'];
}
serialize() {
return Operators.IS_NULL;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtbnVsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvc2VhcmNoL21vZGVscy9vcGVyYXRvci9pcy1udWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sTUFBTyxTQUFRLFFBQWE7SUFDckM7UUFDSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLGVBQThCO1FBQ3RDLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQzFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQ3RHLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gseUJBQXlCLENBQUMsZUFBOEIsRUFBRSxVQUFpQjtRQUN2RSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFDMUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FDcEIsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxNQUFNLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FDNUgsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7T0FHRztJQUNPLGVBQWUsQ0FBQyxjQUFzQjtRQUM1QyxPQUFPLGVBQWUsY0FBYyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHNCQUFzQixDQUFDLGNBQXNCO1FBQ25ELE9BQU8sSUFBSSxjQUFjLE1BQU0sQ0FBQztJQUNwQyxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxTQUFTO1FBQ0wsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQzdCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T3BlcmF0b3J9IGZyb20gJy4vb3BlcmF0b3InO1xuaW1wb3J0IHtRdWVyeX0gZnJvbSAnLi4vcXVlcnkvcXVlcnknO1xuaW1wb3J0IHtPcGVyYXRvcnN9IGZyb20gJy4vb3BlcmF0b3JzJztcblxuLyoqXG4gKiBBbiBvcGVyYXRvciB0aGF0IGNhbiBiZSB1c2VkIG9uIGFueSBmaWVsZCBhbmQgbWF0Y2hlcyBlbnRyaWVzIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgdmFsdWVzLlxuICpcbiAqIEJld2FyZSB0aGF0IGlmIGFueSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBnZW5lcmF0ZWQgcXVlcnkgdGhlIHJlc3VsdHMgbWF5IGJlaGF2ZSBzdHJhbmdlbHkuXG4gKiBDb25zdWx0IHRoZSBbY3JlYXRlUXVlcnlXaXRoQ29uc3RyYWludCgpXXtAbGluayBJc051bGwjY3JlYXRlUXVlcnlXaXRoQ29uc3RyYWludH0gbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgSXNOdWxsIGV4dGVuZHMgT3BlcmF0b3I8YW55PiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlbGFzdGljS2V5d29yZHMgdGhlIHF1ZXJpZWQgZmllbGRzXG4gICAgICogQHJldHVybnMgR2VuZXJhdGVzIGEgcXVlcnkgdGhhdCBtYXRjaGVzIG51bGwgZmllbGRzIGFuZCBmaWVsZHMgd2l0aCBlbXB0eSBzdHJpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIGNyZWF0ZVF1ZXJ5KGVsYXN0aWNLZXl3b3JkczogQXJyYXk8c3RyaW5nPik6IFF1ZXJ5IHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yLmZvckVhY2hLZXl3b3JkKGVsYXN0aWNLZXl3b3JkcyxcbiAgICAgICAgICAgIGtleXdvcmQgPT4gbmV3IFF1ZXJ5KGAoJHt0aGlzLm51bGxRdWVyeVN0cmluZyhrZXl3b3JkKX1PUiR7dGhpcy5lbXB0eVN0cmluZ1F1ZXJ5U3RyaW5nKGtleXdvcmQpfSlgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvdW50ZXJpbnR1aXRpdmVseSBlbGFzdGljc2VhcmNoIHF1ZXJ5IHN0cmluZyBxdWVyaWVzIGJlaGF2ZSB3ZWlyZGx5IHdoZW4gY29tYmluaW5nIHRoZSBxdWVyaWVzIHdpdGggb3BlcmF0b3JzIHN1Y2ggYXMgYEFORGAuXG4gICAgICogQmVjYXVzZSBvZiB0aGlzIHRoZSBmb2xsb3dpbmcgcXVlcnk6XG4gICAgICpcbiAgICAgKiAgICAoZGF0YVNldC50ZXh0XzAudmFsdWU6XCJcIilcbiAgICAgKlxuICAgICAqIHJldHVybnMgYW4gZW1wdHkgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEJ1dCBxdWVyeSB0aGF0IHNob3VsZCBiZSBpbnR1aXRpdmVseSBtb3JlIGNvbnN0cmFpbmluZzpcbiAgICAgKlxuICAgICAqICAgICAoZGF0YVNldC50ZXh0XzAudmFsdWU6XCJcIikgQU5EIChwcm9jZXNzSWQ6NjAwMTY4Y2NmNjhmZWE1MjQxYWU1ZTYyKVxuICAgICAqXG4gICAgICogd2lsbCByZXR1cm4gYSBub24gZW1wdHkgYW5kIGV4cGVjdGVkIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyB0byBjb21iYXQgdGhpcyBpc3N1ZSBhbmQgYWRkIHRoZSwgc29tZXRpbWVzIG5lY2Vzc2FyeSwgY29uc3RyYWludCBpbnRvIHRoZSBxdWVyeSBnZW5lcmF0ZWQgYnkgdGhpcyBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbGFzdGljS2V5d29yZHMgdGhlIHF1ZXJpZWQgZmllbGRzXG4gICAgICogQHBhcmFtIGNvbnN0cmFpbnQgYSBjb25zdHJhaW5pbmcgcXVlcnkgdGhhdCBpcyBkaXN0cmlidXRpdmVseSBhcHBsaWVkIGludG8gdGhlIHF1ZXJ5IGdlbmVyYXRlZCBieSB0aGlzIG9wZXJhdG9yLlxuICAgICAqIElmIGFuIGVtcHR5IHF1ZXJ5IGlzIHByb3ZpZGVkIHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZSBhcyBjYWxsaW5nIFtjcmVhdGVRdWVyeSgpXXtAbGluayBJc051bGwjY3JlYXRlUXVlcnl9LlxuICAgICAqIEByZXR1cm5zIGEgcXVlcnkgd2l0aCBkaXN0cmlidXRpdmVseSBhcHBsaWVkIGNvbnN0cmFpbnQgcXVlcnlcbiAgICAgKi9cbiAgICBjcmVhdGVRdWVyeVdpdGhDb25zdHJhaW50KGVsYXN0aWNLZXl3b3JkczogQXJyYXk8c3RyaW5nPiwgY29uc3RyYWludDogUXVlcnkpOiBRdWVyeSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50LmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXJ5KGVsYXN0aWNLZXl3b3Jkcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT3BlcmF0b3IuZm9yRWFjaEtleXdvcmQoZWxhc3RpY0tleXdvcmRzLFxuICAgICAgICAgICAga2V5d29yZCA9PiBuZXcgUXVlcnkoXG4gICAgICAgICAgICBgKCgke3RoaXMubnVsbFF1ZXJ5U3RyaW5nKGtleXdvcmQpfUFORCR7Y29uc3RyYWludC52YWx1ZX0pT1IoJHt0aGlzLmVtcHR5U3RyaW5nUXVlcnlTdHJpbmcoa2V5d29yZCl9QU5EJHtjb25zdHJhaW50LnZhbHVlfSkpYFxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlbGFzdGljS2V5d29yZCB0aGUgcXVlcmllZCBmaWVsZFxuICAgICAqIEByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWVyeSB0aGF0IGNoZWNrcyB3aGV0aGVyIHRoZSBmaWVsZCBpcyBudWxsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG51bGxRdWVyeVN0cmluZyhlbGFzdGljS2V5d29yZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAoIShfZXhpc3RzXzoke2VsYXN0aWNLZXl3b3JkfSkpYDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZWxhc3RpY0tleXdvcmQgdGhlIHF1ZXJpZWQgZmllbGRcbiAgICAgKiBAcmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVlcnkgdGhhdCBjaGVja3Mgd2hldGhlciB0aGUgZmllbGQgaGFzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBlbXB0eVN0cmluZ1F1ZXJ5U3RyaW5nKGVsYXN0aWNLZXl3b3JkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCgke2VsYXN0aWNLZXl3b3JkfTpcIlwiKWA7XG4gICAgfVxuXG4gICAgZ2V0T3BlcmF0b3JOYW1lVGVtcGxhdGUoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBbJ3NlYXJjaC5vcGVyYXRvci5pc051bGwnXTtcbiAgICB9XG5cbiAgICBzZXJpYWxpemUoKTogT3BlcmF0b3JzIHwgc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9ycy5JU19OVUxMO1xuICAgIH1cbn1cbiJdfQ==