balena-io-modules / odata-parser

4 stars 1 forks source link
pinejs

odata-parser

npm version

An OData parser written in OMeta.

OData is a protocol build on top of REST and HTTP, it's goal is to provide a uniform and reliable way to access and navigate resources.
For a full specification of the protocol refer to this link

This module is a part of the odata-compiler

The parser takes an input string representing the odata request and returns an object {tree, binds} if the parse is successful.

Imagine wanting the access a resource which is stored at as a depth two child of some other resource, the corresponding odata query would be something like /parent/child/granchild
This string is parsed into a tree where every intermediate resource is a node, each node contains the following properties

The binds array contains all the reference to primitive values contained in the odata request, example of such primitive values are: Reals, Booleans, Dates, Text, ecc.
These binds are stored in the binds array and are referenced in the tree by the integer index where the bind resides in this array.

Examples

input: /model

output:

{ tree:
   { resource: 'model',
     key: undefined,
     link: undefined,
     property: undefined,
     count: undefined,
     options: undefined }

input: /model(1)/child

output:

{ tree:
   { resource: 'model',
     key: { bind: 0 },
     link: undefined,
     property:
      { resource: 'child',
        key: undefined,
        link: undefined,
        property: undefined,
        count: undefined,
        options: undefined },
     count: undefined,
     options: undefined },
  binds: [ [ 'Real', 1 ] ] }

input: /model/$count?$filter=id gt 5

output:

{ tree:
   { resource: 'model',
     key: undefined,
     link: undefined,
     property: undefined,
     count: true,
     options: { '$filter': [ 'gt', { name: 'id', property: undefined }, { bind: 0 } ] } },
  binds: [ [ 'Real', 5 ] ] }

Tests

Tests can be found under the test/ folder, to run the whole suite use npm test