Add equals/not equals string criteria (#917)

* Fix encoding of string criteria
* Add equals and includes (and not) string criteria
This commit is contained in:
WithoutPants
2020-11-03 09:26:07 +11:00
committed by GitHub
parent 8e75a8fff5
commit bae82513eb
4 changed files with 21 additions and 42 deletions

View File

@@ -60,20 +60,28 @@ func (qb *queryBuilder) handleIntCriterionInput(c *IntCriterionInput, column str
func (qb *queryBuilder) handleStringCriterionInput(c *StringCriterionInput, column string) { func (qb *queryBuilder) handleStringCriterionInput(c *StringCriterionInput, column string) {
if c != nil { if c != nil {
if modifier := c.Modifier.String(); c.Modifier.IsValid() { if modifier := c.Modifier; c.Modifier.IsValid() {
switch modifier { switch modifier {
case "EQUALS": case CriterionModifierIncludes:
clause, thisArgs := getSearchBinding([]string{column}, c.Value, false) clause, thisArgs := getSearchBinding([]string{column}, c.Value, false)
qb.addWhere(clause) qb.addWhere(clause)
qb.addArg(thisArgs...) qb.addArg(thisArgs...)
case "NOT_EQUALS": case CriterionModifierExcludes:
clause, thisArgs := getSearchBinding([]string{column}, c.Value, true) clause, thisArgs := getSearchBinding([]string{column}, c.Value, true)
qb.addWhere(clause) qb.addWhere(clause)
qb.addArg(thisArgs...) qb.addArg(thisArgs...)
case "IS_NULL": case CriterionModifierEquals:
qb.addWhere(column + " IS NULL") qb.addWhere(column + " LIKE ?")
case "NOT_NULL": qb.addArg(c.Value)
qb.addWhere(column + " IS NOT NULL") case CriterionModifierNotEquals:
qb.addWhere(column + " NOT LIKE ?")
qb.addArg(c.Value)
default:
clause, count := getSimpleCriterionClause(modifier, "?")
qb.addWhere(column + " " + clause)
if count == 1 {
qb.addArg(c.Value)
}
} }
} }
} }

View File

@@ -250,6 +250,8 @@ export class StringCriterion extends Criterion {
public modifierOptions = [ public modifierOptions = [
StringCriterion.getModifierOption(CriterionModifier.Equals), StringCriterion.getModifierOption(CriterionModifier.Equals),
StringCriterion.getModifierOption(CriterionModifier.NotEquals), StringCriterion.getModifierOption(CriterionModifier.NotEquals),
StringCriterion.getModifierOption(CriterionModifier.Includes),
StringCriterion.getModifierOption(CriterionModifier.Excludes),
StringCriterion.getModifierOption(CriterionModifier.IsNull), StringCriterion.getModifierOption(CriterionModifier.IsNull),
StringCriterion.getModifierOption(CriterionModifier.NotNull), StringCriterion.getModifierOption(CriterionModifier.NotNull),
]; ];
@@ -273,36 +275,6 @@ export class StringCriterion extends Criterion {
this.parameterName = type; this.parameterName = type;
} }
} }
public static getModifierOption(
modifier: CriterionModifier = CriterionModifier.Equals
): ILabeledValue {
switch (modifier) {
case CriterionModifier.Equals:
return { value: CriterionModifier.Equals, label: "Includes" };
case CriterionModifier.NotEquals:
return { value: CriterionModifier.NotEquals, label: "Excludes" };
default:
return super.getModifierOption(modifier);
}
}
public getLabel(): string {
let modifierString: string;
switch (this.modifier) {
case CriterionModifier.Equals:
modifierString = "includes";
break;
case CriterionModifier.NotEquals:
modifierString = "excludes";
break;
default:
return super.getLabel();
}
const valueString = this.getLabelValue();
return `${Criterion.getLabel(this.type)} ${modifierString} ${valueString}`;
}
} }
export class MandatoryStringCriterion extends StringCriterion { export class MandatoryStringCriterion extends StringCriterion {

View File

@@ -329,10 +329,7 @@ export class ListFilterModel {
} }
jsonParameters.forEach((jsonString) => { jsonParameters.forEach((jsonString) => {
// make sure we escape \ const encodedCriterion = JSON.parse(jsonString);
const escaped = jsonString.replaceAll("\\", "\\\\");
const encodedCriterion = JSON.parse(escaped);
const criterion = makeCriteria(encodedCriterion.type); const criterion = makeCriteria(encodedCriterion.type);
// it's possible that we have unsupported criteria. Just skip if so. // it's possible that we have unsupported criteria. Just skip if so.
if (criterion) { if (criterion) {

View File

@@ -29,7 +29,9 @@ export interface ILabeledValue {
} }
export function encodeILabeledId(o: ILabeledId) { export function encodeILabeledId(o: ILabeledId) {
return { ...o, label: encodeURIComponent(o.label) }; // escape \ to \\ so that it encodes to JSON correctly
const adjustedLabel = o.label.replaceAll("\\", "\\\\");
return { ...o, label: encodeURIComponent(adjustedLabel) };
} }
export interface IOptionType { export interface IOptionType {