arql-ops
v1.0.0
Published
Tiny library for functional composition of ArQL operators
Downloads
240
Readme
ArQL ops
Very tiny (53 lines including whitespace) library to build ArQL for queries for Arweave https://www.github.com/ArweaveTeam/arweave-js
Packaged up with https://github.com/pikapkg/pack, for web, node, typescript and even deno!
For fun, it's published on the on the arweave blockchain itself :)
npm install https://kybjhezuyftg.arweave.net/ITTPLYoxidZzAJP50FQ03QJUSkkh9iKHcmMcLZOvqtQ
- PROS: exact dependency pinning, immutable blockchain so package can't be removed or replaced with something malicious. (although npm lockfiles and exact versions will take of this too)
- CONS: not exactly easy to remember install line :D manual upgrades
This works because npm can install a .tgz file from any url, so it was just a matter of running pika build
, tar'ing the pkg/ folder it produces, and uploading to arweave.
Usage examples
import { and, or, equals } from 'arql-ops';
const myQuery = and(
equals('from', 'awalletaddressXyz'),
equals('App-Name', 'super-app'),
or(
equals('someTag', '4'),
equals('someTag', '5'),
equals('someTag', '6')
)
);
const results = await arweave.arql(myQuery);
With spread operators:
const myQuery = and(
equals('App-Name', 'my-app'),
equals('myFooTag', 'bar'),
or(
...listOfPossibleSomeTagValues.map(val => equals('someTag', val))
)
);
const results = await arweave.arql(myQuery);
and()
and or()
will take any number of arguments and produce the correct Json of nested expressions:
const query = and(
equals('my-super-tag', '1'),
or(
equals('my-color-tag', 'red'),
equals('my-color-tag', 'blue'),
equals('my-color-tag', 'purple'),
equals('my-color-tag', 'orange'),
equals('my-color-tag', 'white'),
equals('my-color-tag', 'black'),
)
);
This will produce a query that matches TXs with the tag 'my-super-tag'=1 , AND any of the color values that match 'my-color-tag'
Output Json:
{
"op": "and",
"expr1": {
"op": "equals",
"expr1": "my-super-tag",
"expr2": "1"
},
"expr2": {
"op": "or",
"expr1": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "red"
},
"expr2": {
"op": "or",
"expr1": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "blue"
},
"expr2": {
"op": "or",
"expr1": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "purple"
},
"expr2": {
"op": "or",
"expr1": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "orange"
},
"expr2": {
"op": "or",
"expr1": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "white"
},
"expr2": {
"op": "equals",
"expr1": "my-color-tag",
"expr2": "black"
}
}
}
}
}
}
}