Skip to content

Instantly share code, notes, and snippets.

@elmankross
Last active April 3, 2021 10:19
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elmankross/f3342b24b2ea68cfd8ab884558c19556 to your computer and use it in GitHub Desktop.
Save elmankross/f3342b24b2ea68cfd8ab884558c19556 to your computer and use it in GitHub Desktop.
Sieve js filter builder example. git - https://github.com/Biarity/Sieve
declare const enum RequestFilterOperator {
Equals,
NotEquals,
GreaterThan,
LessThan,
GreaterThanOrEqualTo,
LessThanOrEqualTo,
Contains,
StartsWith,
CaseInsensitiveStringContains,
CaseInsensitiveStringStartsWith,
CaseInsensitiveStringEquals
}
declare const enum RequestSortDirection {
Asc,
Desc
}
interface IRequestFilter {
parameter: string;
operator: RequestFilterOperator;
value: string | number;
}
interface IRequestSort {
parameter: string;
direction: RequestSortDirection;
}
interface IRequestQueryBuilder {
filters: IRequestFilter[];
sorts: IRequestSort[];
page: number;
pageSize: number;
buildQuery(): string;
}
class RequestQueryBuilder implements IRequestQueryBuilder {
filters: IRequestFilter[];
sorts: IRequestSort[];
page: number;
pageSize: number;
constructor() {
this.filters = new Array<IRequestFilter>();
this.sorts = new Array<IRequestSort>();
this.page = 1;
this.pageSize = 100;
}
buildQuery(): string {
let result = "filters=";
this.filters.forEach((f, i) => {
let translatedOperator = "";
switch (f.operator) {
case RequestFilterOperator.Equals:
translatedOperator = "==";
break;
case RequestFilterOperator.NotEquals:
translatedOperator = "!=";
break;
case RequestFilterOperator.GreaterThan:
translatedOperator = ">";
break;
case RequestFilterOperator.LessThan:
translatedOperator = "<";
break;
case RequestFilterOperator.GreaterThanOrEqualTo:
translatedOperator = ">=";
break;
case RequestFilterOperator.LessThanOrEqualTo:
translatedOperator = "<=";
break;
case RequestFilterOperator.Contains:
translatedOperator = "@=";
break;
case RequestFilterOperator.StartsWith:
translatedOperator = "_=";
break;
case RequestFilterOperator.CaseInsensitiveStringContains:
translatedOperator = "@=*";
break;
case RequestFilterOperator.CaseInsensitiveStringStartsWith:
translatedOperator = "_=*";
break;
case RequestFilterOperator.CaseInsensitiveStringEquals:
translatedOperator = "==*";
break;
}
result += (i === 0 ? "" : ",") + (f.parameter + translatedOperator + f.value);
});
result += "&sorts=";
this.sorts.forEach((s, i) => {
let translatedValue = "";
switch (s.direction) {
case RequestSortDirection.Asc:
translatedValue = s.parameter;
break;
case RequestSortDirection.Desc:
translatedValue = `-${s.parameter}`;
break;
}
result += (i === 0 ? "" : ",") + translatedValue;
});
result += `&page=${this.page}&pageSize=${this.pageSize}`;
return result;
}
}
let httpQueryBuilder = new RequestQueryBuilder();
httpQueryBuilder.filters.push({
parameter: "my_parameter",
operator: RequestFilterOperator.CaseInsensitiveStringContains,
value: "my_value"
});
httpQueryBuilder.filters.push({
parameter: "mpr",
operator: RequestFilterOperator.Equals,
value: "mvl"
});
httpQueryBuilder.sorts.push({
parameter: "mpr",
direction: RequestSortDirection.Asc
});
let query = httpQueryBuilder.buildQuery();
console.log(`https://my.site.com?${query}`);
// https://my.site.com?filters=my_parameter@=*my_value,mpr==mvl&sorts=mpr&page=1&pageSize=100
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment