Tool for parsing SQL like where expressions and evaluating against live data
Project description
WherEval
Tool for parsing SQL like where expressions and evaluating against live data
Installation
python3 -m pip install whereval
Inspiration
This tool will scratch an itch I've had for some cli tools where I want to pass complex filter expressions to control output / processing.
For instance with my histstat
fork, I would like to have better filtering of networking information to be output to sqlite. See: https://github.com/JavaScriptDude/histstat
Another usecase for this is a tool I've wanted to write where I can write a tail -f
wrapper in python where I can define a filter in cli parameters to limit output to the console. Have not written this yet but its on my todo now that I've got this API.
API Example
(Ex1) Basic Concept:
from datetime import date
from whereval import Where, util as wutil
print("\n(Ex1) Basic Idea")
sw = wutil.StopWatch()
# Where query (terse example)
qry = "(f0>=2+f1=1+f2='s')|(f3~'foo%')"
# Note: Query can be written as ((f0 >= 2 AND f1 = 1 AND f2 = 's') OR (f3 like 'foo%'))
# Data template for defining data types and fields allowed in query
d_tmpl = {'f0': 0,'f1': True,'f2': 's','f3': 's', 'f4': date(1970,1,1)}
# Instantiate Where
# - Parses query and uses data to form rules for data types and fields
wher = Where(query=qry, data_tmpl=d_tmpl)
print(f"Query:\n . raw:\t{qry}\n . compiled: {wher}\n\nTests:")
def _print(w, d, b): print(f"\t{b}\tw/ data: {d}")
# Evaluate expression against real data
dct = {'f0': 2, 'f1': True ,'f2': 's', 'f3': 'foobar'}
_print(wher, dct, wher.evaluate(dct))
# For different data
dct['f3'] = 'bazbar'
_print(wher, dct, wher.evaluate(dct))
# For different data
dct['f0'] = 1
_print(wher, dct, wher.evaluate(dct))
print(f"Completed. Elapsed: {sw.elapsed(3)}s")
Output of print:
(Ex1) Basic Idea
Query:
. raw: (f0>=2+f1=1+f2='s')|(f3~'foo%')
. compiled: ( ( f0 >= 2 AND f1 = 1 AND f2 = 's' ) OR ( f3 like 'foo%' ) )
Tests:
True w/ data: {'f0': 2, 'f1': True, 'f2': 's', 'f3': 'foobar'}
True w/ data: {'f0': 2, 'f1': True, 'f2': 's', 'f3': 'bazbar'}
False w/ data: {'f0': 1, 'f1': True, 'f2': 's', 'f3': 'bazbar'}
Completed. Elapsed: 0.003s
Query Syntax:
# Conditions:
# AND / OR
# Special Conditions:
# + --> AND
# | --> OR
# Operators:
# =, !=, <, <=, >, >=, like
# Special Operators:
# <> --> !=
# ~ --> like
TODO:
[.] implement in (v1, v2, v3)
clauses
[.] implement between (v1, v2)
clauses
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.