mirror of
https://github.com/stashapp/stash.git
synced 2025-12-17 20:34:37 +03:00
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:
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user