Ejemplo n.º 1
0
def test_aggregation_project_fields():
    result = parse('AGGREGATE article PROJECT title = 1, author = 1')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [
        {'$project': {'title': 1, 'author': 1}}
    ]

    result = parse('AGGREGATE article PROJECT _id = 0, title = 1, author = 1')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [
        {'$project': {'_id': 0, 'title': 1, 'author': 1}}
    ]
Ejemplo n.º 2
0
def test_parsing_all_parts():
    query = """
    SELECT field, field1, field2
    FROM mycollection
    WHERE field == 'value'
    LIMIT 100 SKIP 20
    SORT field1 ASC, field2 DESC
    """
    parsed = parse(query)

    assert isinstance(parsed, SelectOperation)

    assert parsed.collection == 'mycollection'
    assert parsed.fields == ['field', 'field1', 'field2']

    assert isinstance(parsed.query, Comparison)
    assert parsed.query.to_mongo() == {'field': 'value'}

    assert parsed.limit == 100
    assert parsed.skip == 20
    assert parsed.sort == {'field1': 1, 'field2': -1}

    class FakeCollection(object):
        def find(self, **kwargs):
            assert set(kwargs.keys()) == set((
                'spec', 'fields', 'limit', 'skip', 'sort'))
            assert kwargs['spec'] == {'field': 'value'}
            assert kwargs['fields'] == ['field', 'field1', 'field2']
            assert kwargs['limit'] == 100
            assert kwargs['skip'] == 20
            assert kwargs['sort'] == {'field1': 1, 'field2': -1}

    parsed.apply({'mycollection': FakeCollection()})
Ejemplo n.º 3
0
def test_parsing_all_parts():
    query = """
    SELECT field, field1, field2
    FROM mycollection
    WHERE field == 'value'
    LIMIT 100 SKIP 20
    SORT field1 ASC, field2 DESC
    """
    parsed = parse(query)

    assert isinstance(parsed, SelectOperation)

    assert parsed.collection == 'mycollection'
    assert parsed.fields == ['field', 'field1', 'field2']

    assert isinstance(parsed.query, Comparison)
    assert parsed.query.to_mongo() == {'field': 'value'}

    assert parsed.limit == 100
    assert parsed.skip == 20
    assert parsed.sort == {'field1': 1, 'field2': -1}

    class FakeCollection(object):
        def find(self, **kwargs):
            assert set(kwargs.keys()) == set(
                ('spec', 'fields', 'limit', 'skip', 'sort'))
            assert kwargs['spec'] == {'field': 'value'}
            assert kwargs['fields'] == ['field', 'field1', 'field2']
            assert kwargs['limit'] == 100
            assert kwargs['skip'] == 20
            assert kwargs['sort'] == {'field1': 1, 'field2': -1}

    parsed.apply({'mycollection': FakeCollection()})
Ejemplo n.º 4
0
def test_aggregation_project_computed_field():
    result = parse(
        'AGGREGATE article PROJECT title = 1, '
        'doctoredPageViews = "$pageViews" + 10')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [
        {'$project': {
            'title': 1,
            'doctoredPageViews': {
                '$add': ['$pageViews', 10],
            }}}]
Ejemplo n.º 5
0
def test_aggregation_project_fields():
    result = parse('AGGREGATE article PROJECT title = 1, author = 1')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [{
        '$project': {
            'title': 1,
            'author': 1
        }
    }]

    result = parse('AGGREGATE article PROJECT _id = 0, title = 1, author = 1')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [{
        '$project': {
            '_id': 0,
            'title': 1,
            'author': 1
        }
    }]
Ejemplo n.º 6
0
def test_parsing_expressions():
    res = parse('SELECT * FROM coll WHERE foo == "Spam" AND bar == "Eggs"')
    # assert res.query.to_mongo() == {
    #     'foo': 'Spam',
    #     'bar': 'Eggs',
    # }
    assert res.query.to_mongo() == {
        '$and': [
            {'foo': 'Spam'},
            {'bar': 'Eggs'},
        ],
    }
    pass
Ejemplo n.º 7
0
def test_aggregation_project_computed_field():
    result = parse('AGGREGATE article PROJECT title = 1, '
                   'doctoredPageViews = "$pageViews" + 10')
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [{
        '$project': {
            'title': 1,
            'doctoredPageViews': {
                '$add': ['$pageViews', 10],
            }
        }
    }]
Ejemplo n.º 8
0
def test_aggregation_project_rename_fields():
    result = parse("""
    AGGREGATE article
    PROJECT title = 1,
            page_views = '$pageViews',
            bar = '$other.foo'
    """)
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [
        {'$project': {
            'title': 1,
            'page_views': '$pageViews',
            'bar': '$other.foo',
        }}]
Ejemplo n.º 9
0
def test_simple_parsing():
    query = "SELECT * FROM mycollection WHERE field == 'value'"
    parsed = parse(query)
    assert isinstance(parsed, SelectOperation)
    assert parsed.collection == 'mycollection'
    assert parsed.fields is None
    assert isinstance(parsed.query, Comparison)
    assert parsed.query.to_mongo() == {'field': 'value'}

    class FakeCollection(object):
        def find(self, **kwargs):
            assert kwargs.keys() == ['spec']
            assert kwargs['spec'] == {'field': 'value'}

    parsed.apply({'mycollection': FakeCollection()})
    pass
Ejemplo n.º 10
0
def test_simple_parsing():
    query = "SELECT * FROM mycollection WHERE field == 'value'"
    parsed = parse(query)
    assert isinstance(parsed, SelectOperation)
    assert parsed.collection == 'mycollection'
    assert parsed.fields is None
    assert isinstance(parsed.query, Comparison)
    assert parsed.query.to_mongo() == {'field': 'value'}

    class FakeCollection(object):
        def find(self, **kwargs):
            assert kwargs.keys() == ['spec']
            assert kwargs['spec'] == {'field': 'value'}

    parsed.apply({'mycollection': FakeCollection()})
    pass
Ejemplo n.º 11
0
def test_aggregation_project_rename_fields():
    result = parse("""
    AGGREGATE article
    PROJECT title = 1,
            page_views = '$pageViews',
            bar = '$other.foo'
    """)
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [{
        '$project': {
            'title': 1,
            'page_views': '$pageViews',
            'bar': '$other.foo',
        }
    }]
Ejemplo n.º 12
0
def test_parsing_expressions():
    res = parse('SELECT * FROM coll WHERE foo == "Spam" AND bar == "Eggs"')
    # assert res.query.to_mongo() == {
    #     'foo': 'Spam',
    #     'bar': 'Eggs',
    # }
    assert res.query.to_mongo() == {
        '$and': [
            {
                'foo': 'Spam'
            },
            {
                'bar': 'Eggs'
            },
        ],
    }
    pass
Ejemplo n.º 13
0
def test_aggregation_project_subdocument():
    result = parse("""
    AGGREGATE article
    PROJECT title = 1,
            stats = {
                pv = '$pageViews',
                foo = '$other.foo',
                dpv = '$pageViews' + 10,
            }
    """)
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [
        {'$project': {
            'title': 1,
            'stats': {
                'pv': "$pageViews",
                'foo': "$other.foo",
                'dpv': {'$add': ["$pageViews", 10]}
            },
        }}]
Ejemplo n.º 14
0
def test_aggregation_project_subdocument():
    result = parse("""
    AGGREGATE article
    PROJECT title = 1,
            stats = {
                pv = '$pageViews',
                foo = '$other.foo',
                dpv = '$pageViews' + 10,
            }
    """)
    assert isinstance(result, AggregateOperation)
    assert result.collection == 'article'
    assert result.to_mongo()['pipeline'] == [{
        '$project': {
            'title': 1,
            'stats': {
                'pv': "$pageViews",
                'foo': "$other.foo",
                'dpv': {
                    '$add': ["$pageViews", 10]
                }
            },
        }
    }]
Ejemplo n.º 15
0
 def sql(self, query):
     return parse(query).apply(self)
Ejemplo n.º 16
0
def test_simple_match(mongodb):
    objects = [
        {'item': 'apple', 'price': 10},
        {'item': 'banana', 'price': 5},
        {'item': 'pear', 'price': 12},
        {'item': 'pineapple', 'price': 50},
        {'item': 'grapes', 'price': 20},
    ]
    for item in objects:
        mongodb.mycollection.save(item)
    q = parse('SELECT * FROM mycollection')
    result = q.apply(mongodb)
    data = list(result)

    ## Objects got modified, they now have an _id
    ## and thus should match exactly the returned data!
    assert data == objects

    ## Now with a "WHERE" clause
    q = parse('SELECT * FROM mycollection WHERE item == "apple"')
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0]]

    ## Now with a "WHERE" clause
    q = parse("""
    SELECT * FROM mycollection
    WHERE item == "apple" OR item == "banana"
    """)
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0], objects[1]]

    ## Let's try the IN operator
    q = parse("""
    SELECT * FROM mycollection
    WHERE item IN ["apple", "banana"]
    """)
    assert q.query.to_mongo() == {'item': {'$in': ['apple', 'banana']}}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0], objects[1]]

    ## Let's try the GT operator
    q = parse("SELECT * FROM mycollection WHERE price > 12")
    assert q.query.to_mongo() == {'price': {'$gt': 12}}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[3], objects[4]]

    ## Let's try the GTE operator
    q = parse("SELECT * FROM mycollection WHERE price >= 12")
    assert q.query.to_mongo() == {'price': {'$gte': 12}}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[2], objects[3], objects[4]]

    ## Let's try the LT operator
    q = parse("SELECT * FROM mycollection WHERE price < 12")
    assert q.query.to_mongo() == {'price': {'$lt': 12}}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0], objects[1]]

    ## Let's try the LTE operator
    q = parse("SELECT * FROM mycollection WHERE price <= 12")
    assert q.query.to_mongo() == {'price': {'$lte': 12}}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0], objects[1], objects[2]]

    ## Let's try with an OR
    q = parse("SELECT * FROM mycollection WHERE price <= 10 or price > 18")
    assert q.query.to_mongo() == {'$or': [
        {'price': {'$lte': 10}},
        {'price': {'$gt': 18}},
    ]}
    result = q.apply(mongodb)
    data = list(result)
    assert data == [objects[0], objects[1], objects[3], objects[4]]