def testNormalizar_dos(self):
     '''
     { '$or': [{'ciudad':'Sevilla'}, { {'$round(3)':'peso'} : 40 ] }
     { '$or': [{'ciudad':'Sevilla'}, { {'$round(3)':'peso'} : {'$gte':40} ] }
     { '$or': [{'ciudad':'Sevilla'}, { {'$round(3)':'peso'} : {'$gte':'@maximo'} ] }
     '''
     
     pruebas = [ 
                 # 1
                 [   {'@edad':20},
                     {'$eq':['@edad',20]}   ],
                 # 2
                 [   [{'@edad':20}], 
                     {'$eq':['@edad',20]}],
                 # 3
                 [   [{'@edad':20},{'@ciudad':'Sevilla'}], 
                     {'$and':[{'$eq':['@edad',20]},{'$eq':['@ciudad','Sevilla']}]}    ],
               
                 # 4
                 [   [{'@edad':20, '@ciudad':'Sevilla'}],
                     [  {'$and':[{'$eq':['@edad',20]},{'$eq':['@ciudad','Sevilla']}]},
                        {'$and':[{'$eq':['@ciudad','Sevilla']},{'$eq':['@edad',20]}]}    ]    ],
               
                 # 5
                 [   {'@edad':20, '@ciudad':'Sevilla'},
                     [   {'$and':[{'$eq':['@edad',20]},{'$eq':['@ciudad','Sevilla']}]},
                         {'$and':[{'$eq':['@ciudad','Sevilla']},{'$eq':['@edad',20]}]}   ]    ],
                 # 6
                 [   {'$eq':[{'$round':['@edad',1]}, 30]},
                     {'$eq':[{'$round':['@edad',1]}, 30]}    ],
               
                 # 7
                 [   { '@ciudad':['Sevilla','Huelva'], '$gte':[{'$round':['@peso',10]},'@maximo'] },
                     [    { '$and':[{'$in':['@ciudad','Sevilla','Huelva']}, {'$gte':[{'$round':['@peso',10]},'@maximo']}] },
                          { '$and':[{'$gte':[{'$round':['@peso',10]},'@maximo']}, {'$in':['@ciudad','Sevilla','Huelva']}] }    ]    ],
                 # 8
                 [   { '@ciudad':['Sevilla','Huelva'], '$gte':[{'$round':['@peso',10]},{'$minAcum':['@maximo']}] }, 
                     [    { '$and':[{'$in':['@ciudad','Sevilla','Huelva']}, {'$gte':[{'$round':['@peso',10]},{'$minAcum':['@maximo']}]}] },
                          { '$and':[{'$gte':[{'$round':['@peso',10]},{'$minAcum':['@maximo']}]}, {'$in':['@ciudad','Sevilla','Huelva']}] }    ]    ],
                 # 9
                 [   { '$or':[{'@ciudad':['Sevilla','Huelva']}, {'@peso':{'$minAcum':['@maximo']}} ] }, 
                     [    { '$or':[{'$in':['@ciudad','Sevilla','Huelva']}, {'$eq':['@peso',{'$minAcum':['@maximo']}]}] },
                          { '$or':[{'$eq':['@peso',{'$minAcum':['@maximo']}]}, {'$in':['@ciudad','Sevilla','Huelva']}] }    ]    ]
                 
                      
               ]
     
     print_debug = False
     # print('testNormalizar')
     n = 0
     for p in pruebas:
         n = n + 1
         if print_debug:
             print()
             print('*'*40)
             print()
             print('Prueba',str(n),p)
             print()
         normalizado = dstools.normalizar(p[0])
         if p[1].__class__.__name__ == 'list':
             if print_debug:
                 print('Es una lista de posibles valores válidos...')
                 print('A normalizar:')
                 print(p[0])
                 print('Normalizado:')
                 print(normalizado)
             resultado = False
             # print('...--- ',p[1])
             for r in p[1]:
                 if print_debug:
                     print('Valor a comparar:')
                     print(r)
                 if r == normalizado:
                     resultado = True
             if print_debug:
                 print('Fin de valores con los que comparar')
             
             self.assertTrue(resultado)
         else:
             if print_debug:
                 print('Solo hay un valor válido con el que comparar:')
                 print(p[1])
                 print('A normalizar:')
                 print(p[0])
                 print('Normalizado:')
                 print(normalizado)
             self.assertEqual(normalizado, p[1])
    def testEvaluar(self):
        data = Datos()
        data.ciudad = 'Sevilla'
        data.destino = 'Córdoba'
        data.preferido = 'Sevilla'
        data.edad = 20
        data.peso = 65.3
        
        pruebas = [ 
                    # 1
                    [   {'@edad':20}, True  ],
                    [   {'@edad':21}, False  ],
                    [   {'@ciudad':'Sevilla'}, True  ],
                    [   {'@ciudad':'Córdoba'}, False  ],
                    # $and reducido
                    [   {'@ciudad':'Sevilla', '@edad':20}, True  ],
                    [   {'@edad':20, '@ciudad':'Sevilla'}, True  ],
                    [   {'@edad':20, '@ciudad':'Cádiz'}, False  ],
                    # $in reducido
                    [   {'@ciudad':['Sevilla','Córdoba']}, True  ],
                    [   {'@ciudad':['Málaga','Córdoba']}, False  ],
                    [   {'@ciudad':['Málaga','Córdoba','Sevilla']}, True  ],
                    # $in reducido y $and reducido
                    [   {'@ciudad':['Málaga','Córdoba','Sevilla'], '@edad':20}, True  ],
                    [   {'@ciudad':['Málaga','Córdoba'], '@edad':20}, False  ],
                    # operadores: $or
                    [   {'$or':[{'@ciudad':['Málaga','Córdoba']}, {'@edad':20}]}, True  ],
                    [   {'$or':[{'@ciudad':['Málaga','Córdoba']}, {'@edad':21}]}, False  ],
                    [   {'$or':[{'@ciudad':['Málaga','Sevilla','Córdoba']}, {'@edad':20}]}, True  ],
                    # operadores: $or, $ne, $nin
                    [   {'$or':[{'@ciudad':['Málaga','Córdoba']}, {'$ne':['@edad',21]}]}, True  ],
                    [   {'$or':[{'@ciudad':['Málaga','Córdoba']}, {'$ne':['@edad',20]}]}, False  ],
                    [   {'$or':[{'$nin':['@ciudad','Málaga','Córdoba']}, {'$ne':['@edad',20]}]}, True  ],
                    # operador $or, $gt, $nin
                    [   {'$gt':['@edad',23]}, False  ],
                    [   {'$or':[{'$nin':['@ciudad','Málaga','Córdoba']}, {'$gt':['@edad',19]}, {'@peso':65} ]}, True  ],
                    [   {'$or':[{'$nin':['@ciudad','Málaga','Sevilla','Córdoba']}, {'$gt':['@edad',23]}, {'@peso':65} ]}, False  ],
                    # operador $and, $gt, $nin
                    [   {'$and':[{'$nin':['@ciudad','Málaga','Córdoba']}, {'$gt':['@edad',19]} ]}, True  ],
                    [   {'$and':[{'$in':['@ciudad','Málaga','Sevilla','Córdoba']}, {'$gt':['@edad',23]}, {'@peso':65.3} ]}, False  ],
                    [   {'$and':[{'$in':['@ciudad','Málaga','Sevilla','Córdoba']}, {'$gt':['@edad',19]}, {'@peso':65.3} ]}, True  ],
                    # operador $or y $and
                    [   {'$and':[{'$or':[{'@ciudad':'Málaga'},{'@ciudad':'Sevilla'}]}, {'$gt':['@edad',19]} ]}, True  ],
                    [   {'$and':[{'$or':[{'@ciudad':'Málaga'},{'@ciudad':'Sevilla'}]}, {'$lt':['@edad',30]} ]}, True  ],
                    [   {'$and':[{'$or':[{'@ciudad':'Málaga'},{'@ciudad':'Sevilla'}]}, {'$lt':['@edad',20]} ]}, False  ],
                    # entre campos @
                    [   {'@ciudad':'@destino'}, False  ],
                    [   {'@ciudad':'@preferido'}, True  ],
                    [   {'$ne':['@ciudad','@preferido']}, False  ],
                    [   {'$ne':['@ciudad','@destino']}, True  ],
                    [   '@ciudad', 'Sevilla'  ],
                    [   {'$ne':[{'$ne':['@ciudad','@destino']},{'@destino':'Sevilla'}]}, True  ],
                    [   {'$and':[{'$ne':['@ciudad','@destino']},{'@preferido':'Córdoba'}]}, False  ],
                    [   {'$and':[{'$ne':['@ciudad','@destino']},{'@preferido':'Sevilla'}]}, True  ],
                    # caso especial (visto de casualidad), $ne de dos valores booleanos resultados de otras comparaciones
                    [   {'$ne':[{'$ne':['@ciudad','@destino']},{'@preferido':'Sevilla'}]}, False  ],
                    [   {'$ne':[{'$ne':['@ciudad','@destino']},{'@preferido':'Córdoba'}]}, True  ],
                    # $not
                    [   {'$not':[True]}, False  ],
                    # funciones constantes. casos de uso
                    [   {'$db':[]}, 'Lo que sea'  ],
                    [   ['$db'], 'Lo que sea'  ],
                    [   {'$eq':[{'$db':[]},'Lo que sea']}, True  ],
                    [   {'$neq':[{'$db':[]},'Lo que sea']}, False  ],
                    [   {'$eq':['$db','Lo que sea']}, True  ],
                    [   {'$eq':['$db','Lo que sea'],'@ciudad':'Sevilla'}, True  ],
                    [   [{'$eq':['$db','Lo que sea']},{'@ciudad':'Sevilla'}], True  ],
                  ]

        # print('testNormalizar')
        n = 0
        for p in pruebas:
            n = n + 1
            valor = dstools.evalue(dstools.normalizar(p[0]), data)
            self.assertEqual(valor, p[1])
Exemple #3
0
def optimizer(query, metadata):
    normalized_query = dstools.normalizar(query)
    print(normalized_query)
    arbol = EXPtree.EXPTree()
    query_en_arbol = query_a_arbol(query, arbol)
    return