def does_match(self, content_filter, article, filters=None): if not content_filter: return True # a non-existing filter matches every thing filter_condition_service = get_resource_service("filter_conditions") expressions = [] for index, expression in enumerate( content_filter.get("content_filter", [])): if not expression.get("expression"): raise SuperdeskApiError.badRequestError( _("Filter statement {index} does not have a filter condition" ).format(index=index + 1)) filter_conditions = [] if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: fc = (filters.get("filter_conditions", {}).get( f, {}).get("fc") if filters else filter_condition_service.find_one(req=None, _id=f)) filter_condition = FilterCondition.parse(fc) filter_conditions.append( filter_condition.does_match(article)) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = (filters.get("content_filters", {}).get( f, {}).get("cf") if filters else super().find_one( req=None, _id=f)) filter_conditions.append( self.does_match(current_filter, article)) expressions.append(all(filter_conditions)) return any(expressions)
def build_mongo_query(self, doc): filter_condition_service = get_resource_service("filter_conditions") expressions = [] for expression in doc.get("content_filter", []): filter_conditions = [] if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: current_filter = FilterCondition.parse( filter_condition_service.find_one(req=None, _id=f)) mongo_query = current_filter.get_mongo_query() filter_conditions.append(mongo_query) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = super().find_one(req=None, _id=f) mongo_query = self.build_mongo_query(current_filter) filter_conditions.append(mongo_query) if len(filter_conditions) > 1: expressions.append({"$and": filter_conditions}) else: expressions.extend(filter_conditions) if len(expressions) > 1: return {"$or": expressions} else: return expressions[0]
def _get_elastic_query(self, doc, matching=True): expressions_list = [] if matching: expressions = {"should": expressions_list} else: expressions = {"must_not": expressions_list} filter_condition_service = get_resource_service("filter_conditions") for expression in doc.get("content_filter", []): filter_conditions = { "must": [], "must_not": [{ "term": { "state": "spiked" } }] } if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: current_filter = FilterCondition.parse( filter_condition_service.find_one(req=None, _id=f)) elastic_query = current_filter.get_elastic_query() if current_filter.contains_not(): filter_conditions["must_not"].append(elastic_query) else: filter_conditions["must"].append(elastic_query) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = super().find_one(req=None, _id=f) elastic_query = self._get_elastic_query(current_filter) filter_conditions["must"].append(elastic_query) expressions_list.append({"bool": filter_conditions}) return {"bool": expressions}
def build_mongo_query(self, doc): filter_condition_service = get_resource_service('filter_conditions') expressions = [] for expression in doc.get('content_filter', []): filter_conditions = [] if 'fc' in expression.get('expression', {}): for f in expression['expression']['fc']: current_filter = FilterCondition.parse( filter_condition_service.find_one(req=None, _id=f)) mongo_query = current_filter.get_mongo_query() filter_conditions.append(mongo_query) if 'pf' in expression.get('expression', {}): for f in expression['expression']['pf']: current_filter = super().find_one(req=None, _id=f) mongo_query = self.build_mongo_query(current_filter) filter_conditions.append(mongo_query) if len(filter_conditions) > 1: expressions.append({'$and': filter_conditions}) else: expressions.extend(filter_conditions) if len(expressions) > 1: return {'$or': expressions} else: return expressions[0]
def build_mongo_query(self, doc): filter_condition_service = get_resource_service("filter_conditions") expressions = [] for expression in doc.get("content_filter", []): filter_conditions = [] if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: current_filter = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) mongo_query = current_filter.get_mongo_query() filter_conditions.append(mongo_query) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = super().find_one(req=None, _id=f) mongo_query = self.build_mongo_query(current_filter) filter_conditions.append(mongo_query) if len(filter_conditions) > 1: expressions.append({"$and": filter_conditions}) else: expressions.extend(filter_conditions) if len(expressions) > 1: return {"$or": expressions} else: return expressions[0]
def _get_elastic_query(self, doc, matching=True): expressions_list = [] if matching: expressions = {'should': expressions_list} else: expressions = {'must_not': expressions_list} filter_condition_service = get_resource_service('filter_conditions') for expression in doc.get('content_filter', []): filter_conditions = {'must': [], 'must_not': [{"term": {"state": "spiked"}}]} if 'fc' in expression.get('expression', {}): for f in expression['expression']['fc']: current_filter = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) elastic_query = current_filter.get_elastic_query() if current_filter.contains_not(): filter_conditions['must_not'].append(elastic_query) else: filter_conditions['must'].append(elastic_query) if 'pf' in expression.get('expression', {}): for f in expression['expression']['pf']: current_filter = super().find_one(req=None, _id=f) elastic_query = self._get_elastic_query(current_filter) filter_conditions['must'].append(elastic_query) expressions_list.append({'bool': filter_conditions}) return {'bool': expressions}
def build_mongo_query(self, doc): filter_condition_service = get_resource_service('filter_conditions') expressions = [] for expression in doc.get('content_filter', []): filter_conditions = [] if 'fc' in expression.get('expression', {}): for f in expression['expression']['fc']: current_filter = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) mongo_query = current_filter.get_mongo_query() filter_conditions.append(mongo_query) if 'pf' in expression.get('expression', {}): for f in expression['expression']['pf']: current_filter = super().find_one(req=None, _id=f) mongo_query = self.build_mongo_query(current_filter) filter_conditions.append(mongo_query) if len(filter_conditions) > 1: expressions.append({'$and': filter_conditions}) else: expressions.extend(filter_conditions) if len(expressions) > 1: return {'$or': expressions} else: return expressions[0]
def does_match(self, content_filter, article): if not content_filter: return True # a non-existing filter matches every thing filter_condition_service = get_resource_service("filter_conditions") expressions = [] for expression in content_filter.get("content_filter", []): filter_conditions = [] if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: filter_condition = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) filter_conditions.append(filter_condition.does_match(article)) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = super().find_one(req=None, _id=f) filter_conditions.append(self.does_match(current_filter, article)) expressions.append(all(filter_conditions)) return any(expressions)
def does_match(self, content_filter, article): if not content_filter: return True # a non-existing filter matches every thing filter_condition_service = get_resource_service('filter_conditions') expressions = [] for expression in content_filter.get('content_filter', []): filter_conditions = [] if 'fc' in expression.get('expression', {}): for f in expression['expression']['fc']: filter_condition = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) filter_conditions.append(filter_condition.does_match(article)) if 'pf' in expression.get('expression', {}): for f in expression['expression']['pf']: current_filter = super().find_one(req=None, _id=f) filter_conditions.append(self.does_match(current_filter, article)) expressions.append(all(filter_conditions)) return any(expressions)
def does_match(self, content_filter, article): if not content_filter: return True # a non-existing filter matches every thing filter_condition_service = get_resource_service('filter_conditions') expressions = [] for expression in content_filter.get('content_filter', []): filter_conditions = [] if 'fc' in expression.get('expression', {}): for f in expression['expression']['fc']: filter_condition = FilterCondition.parse( filter_condition_service.find_one(req=None, _id=f)) filter_conditions.append( filter_condition.does_match(article)) if 'pf' in expression.get('expression', {}): for f in expression['expression']['pf']: current_filter = super().find_one(req=None, _id=f) filter_conditions.append( self.does_match(current_filter, article)) expressions.append(all(filter_conditions)) return any(expressions)
def _get_elastic_query(self, doc, matching=True): expressions_list = [] if matching: expressions = {"should": expressions_list} else: expressions = {"must_not": expressions_list} filter_condition_service = get_resource_service("filter_conditions") for expression in doc.get("content_filter", []): filter_conditions = {"must": []} if "fc" in expression.get("expression", {}): for f in expression["expression"]["fc"]: current_filter = FilterCondition.parse(filter_condition_service.find_one(req=None, _id=f)) elastic_query = current_filter.get_elastic_query() filter_conditions["must"].append(elastic_query) if "pf" in expression.get("expression", {}): for f in expression["expression"]["pf"]: current_filter = super().find_one(req=None, _id=f) elastic_query = self._get_elastic_query(current_filter) filter_conditions["must"].append(elastic_query) expressions_list.append({"bool": filter_conditions}) return {"bool": expressions}