Example #1
0
def test_complex_field():
    engine = Engine(SyncExecutor())

    def get_a(fields, ids):
        return [[{'s': 'bar'} for _ in fields] for _ in ids]

    ll_graph = Graph([
        Node('Foo', [
            Field('a', Record[{
                's': String
            }], get_a),
        ]),
    ])
    foo_sg = SubGraph(ll_graph, 'Foo')
    hl_graph = Graph([
        Node('Foo', [
            Field('a', Record[{
                's': String
            }], foo_sg),
        ]),
        Root([
            Link('foo', TypeRef['Foo'], lambda: 1, requires=None),
        ]),
    ])
    result = engine.execute(hl_graph, build([Q.foo[Q.a[Q.s]]]))
    check_result(result, {'foo': {'a': {'s': 'bar'}}})
Example #2
0
async def test_simple_async(graph_name, sample_count):
    async def x_fields(fields, ids):
        return [[42 for _ in fields] for _ in ids]

    async def root_fields(fields):
        return [1 for _ in fields]

    async def x_link():
        return 2

    ll_graph = Graph([
        Node('X', [
            Field('id', None, x_fields),
        ]),
    ])

    x_sg = SubGraph(ll_graph, 'X')

    hl_graph = Graph([
        Node('X', [
            Field('id', None, x_sg),
        ]),
        Root([
            Field('a', None, root_fields),
            Link('x', TypeRef['X'], x_link, requires=None),
        ]),
    ])

    hl_graph = apply(hl_graph, [AsyncGraphMetrics(graph_name)])

    query = q.Node([
        q.Field('a'),
        q.Link('x', q.Node([
            q.Field('id'),
        ])),
    ])

    engine = Engine(AsyncIOExecutor())

    assert sample_count('Root', 'a') is None
    assert sample_count('Root', 'x') is None
    assert sample_count('X', 'id') is None

    result = await engine.execute(hl_graph, query)
    check_result(result, {
        'a': 1,
        'x': {
            'id': 42,
        },
    })

    assert sample_count('Root', 'a') == 1.0
    assert sample_count('Root', 'x') == 1.0
    assert sample_count('X', 'id') == 1.0
Example #3
0
def bar(x):
    return '{x[b]} {x[y][d]}'.format(x=x).upper()


@define(Record[{'d': Any, 'xs': Sequence[Record[{'b': Any}]]}])
def baz(y):
    xs = ', '.join('{x[b]}'.format(x=x) for x in y['xs'])
    return '{y[d]} [{xs}]'.format(y=y, xs=xs).upper()


@define(Record[{'a': Any}], Any)
def buz(x, size):
    return '{x[a]} - {size}'.format(x=x, size=size)


sg_x = SubGraph(_GRAPH, 'x')

sg_y = SubGraph(_GRAPH, 'y')

# TODO: refactor
GRAPH = Graph([
    Node('x1', [
        Field('id', None, sg_x),
        Field('a', None, sg_x),
        Field('f', None, sg_x.c(S.f1)),
        Field('foo', None, sg_x.c(foo(S.this, S.this.y))),
        Field('bar', None, sg_x.c(bar(S.this))),
        Field('baz', None, sg_x.c(baz(S.this.y))),
        Field('buz',
              None,
              sg_x.c(buz(S.this, S.size)),
Example #4
0

# define high-level graph

from hiku.types import Record, Integer, String
from hiku.expr.core import S, define, if_some
from hiku.sources.graph import SubGraph


@define(Record[{'id': Integer, 'name': String}])
def image_url(image):
    return 'http://example.com/{id}-{name}'.format(id=image['id'],
                                                   name=image['name'])


character_sg = SubGraph(_GRAPH, 'Character')

GRAPH = Graph([
    Node('Character', [
        Field('id', None, character_sg),
        Field('name', None, character_sg),
        Field(
            'image-url', None,
            character_sg.c(
                if_some([S.img, S.this.image], image_url(S.img),
                        'http://example.com/no-photo.jpg'), )),
    ]),
    Root([
        Link('characters',
             Sequence[TypeRef['Character']],
             to_characters_query,
def field_func():
    raise NotImplementedError


def link_func():
    raise NotImplementedError


_GRAPH = Graph([
    Node('flexed', [
        Field('yari', Boolean, field_func),
    ]),
])

flexed_sg = SubGraph(_GRAPH, 'flexed')

GRAPH = Graph([
    Node('flexed', [
        Field('yari',
              Boolean,
              flexed_sg,
              options=[
                  Option('membuka', Sequence[String], default=['frayed']),
                  Option('modist',
                         Optional[Integer],
                         default=None,
                         description='callow'),
              ]),
    ]),
    Node('decian', [