def test_2path_greater_quantity(): hs_filter = 'siteRef->temp >= 55400°' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 10, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': { 'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$lookup': { 'from': 'haystack', 'as': 'siteRef_entity_', 'let': {'siteRef_id_': '$siteRef'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$siteRef_id_']}]}}}]}}, {'$set': {'siteRef_entity_': {'$arrayElemAt': ['$siteRef_entity_.entity', 0]}}}, {'$match': {'$expr': {'$gte': [ {'$let': {'vars': {'siteRef_regex_': { '$regexFind': {'input': '$siteRef_entity_.temp', 'regex': 'n:([-+]?([0-9]*[.])?[0-9]+([eE][-+]?\\d+)?)'}}}, 'in': {'$toDouble': {'$arrayElemAt': ['$$siteRef_regex_.captures', 0]}}}}, 55400.0]}}}, {'$replaceRoot': {'newRoot': '$$ROOT'}}, {'$limit': 10}]
def test_path_and(): hs_filter = 'equipRef->siteRef and equipRef->siteRef' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 10, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [ {'$match': { 'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$lookup': { 'from': 'haystack', 'as': 'equipRef_entity_', 'let': {'equipRef_id_': '$equipRef'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$equipRef_id_']}]}}}]}}, {'$set': {'equipRef_entity_': {'$arrayElemAt': ['$equipRef_entity_.entity', 0]}}}, {'$match': {'$expr': {'$and': [ {'$ne': [{'$type': '$equipRef_entity_.siteRef'}, 'missing']}, {'$ne': [{'$type': '$equipRef_entity_.siteRef'}, 'missing']}]}}}, {'$replaceRoot': {'newRoot': '$$ROOT'}}, {'$limit': 10}]
def test_equal_float(): hs_filter = 'a == 1.0' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': {'$expr': {'$eq': ['$a', 'n:1.000000']}}}, {'$limit': 1}]
def test_not_tag(): hs_filter = 'not site' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': {'$expr': {'$eq': [{'$type': '$site'}, 'missing']}}}, {'$limit': 1}]
def test_equal_xstr(): hs_filter = 'a == hex("deadbeef")' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': {'$expr': {'$eq': ['$a', 'x:hex:deadbeef']}}}, {'$limit': 1}]
def test_equal_ref(): hs_filter = 'id == @id_site' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': { '$expr': {'$eq': [{'$let': { 'vars': {'id_regex_': {'$regexFind': {'input': '$id', 'regex': 'r:([:.~a-zA-Z0-9_-]+)'}}}, 'in': {'$arrayElemAt': ['$$id_regex_.captures', 0]}}}, 'id_site']}}}, {'$limit': 1}]
def test_and_ltag_rtag(): hs_filter = 'site and ref' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) # noinspection PyPep8 assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': { '$expr': {'$and': [{'$ne': [{'$type': '$site'}, 'missing']}, {'$ne': [{'$type': '$ref'}, 'missing']}]}}}, {'$limit': 1}]
def test_combine_and(): hs_filter = '(a==1 and b==1) or (c==2 and d==3)' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) # noinspection PyPep8 assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': { '$expr': {'$or': [{'$and': [{'$eq': ['$a', 'n:1.000000']}, {'$eq': ['$b', 'n:1.000000']}]}, {'$and': [{'$eq': ['$c', 'n:2.000000']}, {'$eq': ['$d', 'n:3.000000']}]}]}}}, {'$limit': 1}]
def test_select_with_id(): hs_filter = 'id==@p:demo:r:23a44701-3a62fd7a' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) # noinspection PyPep8 assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': { '$expr': {'$eq': [{'$let': { 'vars': {'id_regex_': {'$regexFind': {'input': '$id', 'regex': 'r:([:.~a-zA-Z0-9_-]+)'}}}, 'in': {'$arrayElemAt': ['$$id_regex_.captures', 0]}}}, 'p:demo:r:23a44701-3a62fd7a']}}}, {'$limit': 1}]
def test_greater_or_equal_quantity(): hs_filter = 'temp >= 55400°' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 1, "customer") _check_mongodb(hs_filter, mongo_request) # noinspection PyPep8 assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$match': { '$expr': {'$gte': [{'$let': {'vars': {'temp_regex_': { '$regexFind': {'input': '$temp', 'regex': 'n:([-+]?([0-9]*[.])?[0-9]+([eE][-+]?\\d+)?)'}}}, 'in': {'$toDouble': {'$arrayElemAt': ['$$temp_regex_.captures', 0]}}}}, 55400.0]}}}, {'$limit': 1}]
def test_complex(): hs_filter = '(a->b or c->d) and e or (f and g->h)' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 10, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': { 'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$lookup': { 'from': 'haystack', 'as': 'a_entity_', 'let': {'a_id_': '$a'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$a_id_']}]}}}]}}, {'$set': {'a_entity_': {'$arrayElemAt': ['$a_entity_.entity', 0]}}}, {'$lookup': { 'from': 'haystack', 'as': 'c_entity_', 'let': {'c_id_': '$c'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$c_id_']}]}}}]}}, {'$set': {'c_entity_': {'$arrayElemAt': ['$c_entity_.entity', 0]}}}, {'$lookup': { 'from': 'haystack', 'as': 'g_entity_', 'let': {'g_id_': '$g'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$g_id_']}]}}}]}}, {'$set': {'g_entity_': {'$arrayElemAt': ['$g_entity_.entity', 0]}}}, {'$match': {'$expr': {'$or': [ {'$and': [{'$or': [ {'$ne': [{'$type': '$a_entity_.b'}, 'missing']}, {'$ne': [{'$type': '$c_entity_.d'}, 'missing']}]}, {'$ne': [{'$type': '$e'}, 'missing']}]}, {'$and': [ {'$ne': [{'$type': '$f'}, 'missing']}, {'$ne': [{'$type': '$g_entity_.h'}, 'missing']}]}]}}}, {'$replaceRoot': {'newRoot': '$$ROOT'}}, {'$limit': 10}]
def test_path_or(): hs_filter = 'siteRef->geoPostalCode or siteRef->geoCountry' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 10, "customer") _check_mongodb(hs_filter, mongo_request) # noinspection PyPep8 assert mongo_request == \ [{'$match': {'customer_id': 'customer', 'start_datetime': { '$lte': FAKE_NOW}, 'end_datetime': { '$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, { '$lookup': { 'from': 'haystack', 'as': 'siteRef_entity_', 'let': {'siteRef_id_': '$siteRef'}, 'pipeline': [{ '$match': { '$expr': { '$and': [ { '$eq': [ '$customer_id', 'customer']}, { '$lte': [ '$start_datetime', FAKE_NOW]}, { '$gt': ['$end_datetime', FAKE_NOW]}, { '$eq': ['$entity.id', '$$siteRef_id_']}]}}}]}}, {'$set': { 'siteRef_entity_': {'$arrayElemAt': ['$siteRef_entity_.entity', 0]}}}, { '$lookup': { 'from': 'haystack', 'as': 'siteRef_entity_', 'let': {'siteRef_id_': '$siteRef'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, { '$lte': ['$start_datetime', FAKE_NOW]}, { '$gt': ['$end_datetime', FAKE_NOW]}, { '$eq': ['$entity.id', '$$siteRef_id_']}]}}}]}}, {'$set': { 'siteRef_entity_': {'$arrayElemAt': ['$siteRef_entity_.entity', 0]}}}, {'$match': {'$expr': { '$or': [{'$ne': [{'$type': '$siteRef_entity_.geoPostalCode'}, 'missing']}, {'$ne': [{'$type': '$siteRef_entity_.geoCountry'}, 'missing']}]}}}, { '$replaceRoot': {'newRoot': '$$ROOT'}}, {'$limit': 10}]
def test_path_equal_quantity(): hs_filter = 'siteRef->curVal == 55400°' mongo_request = mongo_filter(hs_filter, FAKE_NOW, 10, "customer") _check_mongodb(hs_filter, mongo_request) assert mongo_request == \ [{'$match': { 'customer_id': 'customer', 'start_datetime': {'$lte': FAKE_NOW}, 'end_datetime': {'$gt': FAKE_NOW}}}, {'$replaceRoot': {'newRoot': '$entity'}}, {'$lookup': { 'from': 'haystack', 'as': 'siteRef_entity_', 'let': {'siteRef_id_': '$siteRef'}, 'pipeline': [{'$match': {'$expr': {'$and': [ {'$eq': ['$customer_id', 'customer']}, {'$lte': ['$start_datetime', FAKE_NOW]}, {'$gt': ['$end_datetime', FAKE_NOW]}, {'$eq': ['$entity.id', '$$siteRef_id_']}]}}}]}}, {'$set': {'siteRef_entity_': {'$arrayElemAt': ['$siteRef_entity_.entity', 0]}}}, {'$match': {'$expr': {'$eq': ['$siteRef_entity_.curVal', 'n:55400.000000 \\u00b0']}}}, {'$replaceRoot': {'newRoot': '$$ROOT'}}, {'$limit': 10}]