def execute_query(filters=list(), projection=None): """ :param filters: :param projection: :return: """ # query = { # "$and": [] # } results_id = {xml_data["_id"] for xml_data in XMLdata.objects()} results = [] # Parsing filters if present for _filter in filters: if _is_advanced_filter(_filter): json_filter = json.loads(_filter) # Get matching document # list possible values of the right hand side # match resulted documents documents_field = json_filter["documents"].values()[0] values = get_filter_values(documents_field) matching_documents = get_matching_document( json_filter["documents"].keys()[0], values, json_filter["query"]) # Extract correct documents filter_result = [] for doc in matching_documents: doc_cross_query = { json_filter["documents"].values()[0]: get_projection(doc) } filter_result += XMLdata.executeQueryFullResult( doc_cross_query, json.loads(projection)) else: filter_result = XMLdata.executeQueryFullResult( json.loads(_filter), json.loads(projection)) filter_id = {document["_id"] for document in filter_result} results_id = results_id.intersection(filter_id) results = [doc for doc in filter_result if doc["_id"] in results_id] return results
def dump_xmldata(self): self.assertEquals(len(XMLdata.objects()), 0) self.dump_template() self.restoreDump(join(DUMP_TEST_PATH, 'xmldata.bson'), 'xmldata') self.assertTrue(len(XMLdata.objects()) > 0)