1.0.6 • Published 5 months ago

@vivek1052/odata-filter-parser v1.0.6

Weekly downloads
-
License
ISC
Repository
github
Last release
5 months ago

Odata-filter-parser

One of the main shortcomings of REST is inability to support filter queries. If the queries involve nested logical operators(AND, OR), it need specific custom implementation and your own Query language.

Odata has this shortcoming covered since they support $filter query parameter. Although, projects which are already built on REST might feel difficult to move to OData.

This library is created to solve this issue, where we can have simplicity of REST along with filtering capability of Odata. This is a database agnostic library which can be used to parse Odata $filter to a database specific query.

Example

npm install @vivek1052/odata-filter-parser

Code Sample:

  import { QueryFilterParser, MongoStrategy } from "@vivek1052/odata-filter-parser";

  const odataQuery = "( bookPrice gte 100 and ( authorName contains 'King' or releaseYear eq 2023 ))";

  const mongoQuery = new QueryFilterParser(new MongoStrategy()).parse(odataQuery);

You will get a Mongo Db filter which can be directly injected into queries like find.

{
  $and: [{
          $or: [
                  { releaseYear: 2023 },
                  { authorName : { $regex: 'King' }}
               ]
         },
         {
          bookPrice: { $gte: 100 }
         }]
}

As an example, two database strategies are created in this repo (Mongodb, sqlite) but one can very easily create/update their specific database strategies by implementing DBStrategy.

This interface requires two method implementation mapConditional which maps eq, gte etc to database specific conditional operators and mapLogic which maps and, or to database specifc logical operator.

Currently supported operators.

 export enum ConditionalOperator {
  EQ = "eq",
  GT = "gt",
  LT = "lt",
  GTE = "gte",
  LTE = "lte",
  NE = "ne",
  CONTAINS = "contains",
}

export enum LogicalOperator {
  OR = "or",
  AND = "and",
}
1.0.6

5 months ago