https://github.com/nfour/jsonb-builder
Construct jsonb queries with javascript.
https://github.com/nfour/jsonb-builder
Last synced: 7 months ago
JSON representation
Construct jsonb queries with javascript.
- Host: GitHub
- URL: https://github.com/nfour/jsonb-builder
- Owner: nfour
- Created: 2016-04-23T06:20:44.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2016-07-21T05:04:34.000Z (about 10 years ago)
- Last Synced: 2025-03-12T09:18:26.522Z (over 1 year ago)
- Language: JavaScript
- Size: 20.5 KB
- Stars: 3
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
README
# JSONB BUILDER
Creates JSONB selector & compartor strings for use in postgres `jsonb` queries.
`npm install jsonb-builder`
```js
import Jsonb from 'jsonb-builder'
//
// Build a comparison for a where statement
//
const jsonbComparison = new Jsonb({ column: 'data' }).get("a['33_1'].a", 1)
/*
"( data -> 'a' -> '33_1' ->> 'a' )::int = 1"
*/
//
// Get just a selector (for use in columns)
//
const jsonbSelector = new Jsonb({ column: 'data' }).selector("a['33_1'].a", 1)
/*
"( data -> 'a' -> '33_1' ->> 'a' )"
*/
//
// Escape with a transform
//
const jsonbComparison2 = new Jsonb({
column: 'data',
transform: (val) => Knex.raw('?', [val]),
}).selector("a['33_1'].a", "some'; drop table bobby")
/*
"( data -> 'a' -> '33_1' ->> 'a' ) = 'some\'; drop table bobby'"
*/
//
// Get many
//
const query = new Jsonb({ column: 'test' }).get({
foo : { bar: 1 },
"test[1]" : { $lt: 3 }
})
/*
[
[ "( test ->> 'foo' -> 'bar' )::int = 1" ]
[ "( test ->> 'test' -> 1 )::int < 3" ]
]
*/
//
// Get class instances for more control
//
const queries = new Jsonb({ column: 'data' }).build({
something : { $like: '%word' },
equals : { $eq: 'value' },
equals2 : 'value',
"some.thing[0]['!deeper!']": {
$lt: 5,
$gt: 2,
},
})
const comparisons = queries.map((query) => query.get())
/*
[
[ "( data ->> 'something' ) LIKE '%word'" ],
[ "( data ->> 'equals' ) = 'value'" ],
[ "( data ->> 'equals2' ) = 'value'" ],
[
"( data -> 'some' -> 'thing' -> 0 ->> '!deeper!' )::int < 5",
"( data -> 'some' -> 'thing' -> 0 ->> '!deeper!' )::int > 2"
]
]
*/
// use `asSelector` to exclude the comparison logic
const statements = queries.map((query) => query.selector())
/*
[
[ "( data ->> 'something' )" ],
[ "( data ->> 'equals' )" ],
[ "( data ->> 'equals2' )" ],
[ "( data -> 'some' -> 'thing' -> 0 ->> '!deeper!' )" ]
]
*/
```
### Caveats
- Be sure to escape your values.
### Search comparitors
- `$eq` -- `= 1`
- `$ne` -- `!= 1`
- `$like` -- `LIKE '%str%'` (`%` must already exist in input)
- `$notLike` -- `NOT LIKE '%str%'`
- `$iLike` -- `ILIKE '%str%'`
- `$notILike` -- `NOT ILIKE '%str%'`
- `$gt` -- `>`
- `$gte` -- `>=`
- `$lt` -- `<`
- `$lte` -- `<=`
- `$between` -- `BETWEEN`
- `$notBetween` -- `NOT BETWEEN`
- `$not` -- `NOT`
- `$in` -- `IN`
- `$notIn` -- `NOT IN`
- `$overlap` -- `&&`
- `$contains` -- `@>`
- `$contained` -- `<@`
- `$any` -- `ANY`
### TODO
- [x] Add more comparitors
- [ ] Test all comparitors
- [ ] Add more type casting logic