Last active
April 3, 2021 10:19
-
-
Save elmankross/f3342b24b2ea68cfd8ab884558c19556 to your computer and use it in GitHub Desktop.
Sieve js filter builder example. git - https://github.com/Biarity/Sieve
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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