Compilers

Native

Compile into Python function

This compiler compiles ruleset into an executable Python function.

Example:

>>> import rulez
>>> engine = rulez.Engine()
>>> rule = {
...     "operator": "or", "value": [
...         {"field": "age", "operator": "<=", "value": 16},
...         {"field": "age", "operator": ">=", "value": 21},
...         {"field": "age", "operator": "==", "value": 18}
...     ]
... }
>>> f = engine.compile_condition('native', rule)
>>> f({'age': 13})
True

SQLAlchemy

Compile into SQLAlchemy condition factory.

This compiler compiles into a factory function that that accepts SQLAlchemy ORM model as its parameter, and outputs a SQLAlchemy condition object for use in .filter() method in queries.

Example:

>>> from sqlalchemy.ext.declarative import declarative_base
>>> import sqlalchemy as sa
>>> from sqlalchemy.orm import sessionmaker
>>> import rulez

>>> Session = sessionmaker()
>>> Base = declarative_base()

>>> class Object(Base):
...    __tablename__ = 'test_objects'
...    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
...    age = sa.Column(sa.Integer, name='Age')

>>> engine = sa.create_engine('sqlite://')
>>> Session.configure(bind=engine)
>>> Base.metadata.create_all(engine)
>>> session = Session()

>>> session.add(Object(age=50))
>>> session.add(Object(age=18))
>>> session.add(Object(age=10))
>>> session.add(Object(age=17))
>>> session.add(Object(age=19))
>>> session.flush()

>>> rule = {
...     "operator": "or", "value": [
...         {"field": "age", "operator": "<=", "value": 16},
...         {"field": "age", "operator": ">=", "value": 21},
...         {"field": "age", "operator": "==", "value": 18}
...     ]
... }

>>> engine = rulez.Engine()
>>> cond = engine.compile_condition('sqlalchemy', rule)

>>> q = session.query(Object).filter(cond(Object))
>>> sorted([o.age for o in q.all()])
[10, 18, 50]

ElasticSearch

Compile into ElasticSearch condition factory.

This compiler compiles ruleset into a factory function that returns a json dictionary for use in elasticsearch 'query' body.

Example:

>>> import rulez 
>>> engine = rulez.Engine()
>>> rule = {
...     "operator": "or", "value": [
...         {"field": "age", "operator": "<=", "value": 16},
...         {"field": "age", "operator": ">=", "value": 21},
...         {"field": "age", "operator": "==", "value": 18}
...     ]
... }

>>> f = engine.compile_condition('elasticsearch', rule)
>>> f()
{'bool': {'minimum_should_match': 1,
          'should': [{'range': {'age': {'lte': 16}}},
                     {'range': {'age': {'gte': 21}}},
                     {'term': {'age': 18}}]}}