def _range_composer(edge, domain, es_query, to_float, schema): # USE RANGES _min = coalesce(domain.min, MIN(domain.partitions.min)) _max = coalesce(domain.max, MAX(domain.partitions.max)) if edge.allowNulls: missing_filter = set_default( { "filter": NotOp("not", AndOp("and", [ edge.value.exists(), InequalityOp("gte", [edge.value, Literal(None, to_float(_min))]), InequalityOp("lt", [edge.value, Literal(None, to_float(_max))]) ]).partial_eval()).to_esfilter(schema) }, es_query ) else: missing_filter = None if isinstance(edge.value, Variable): calc = {"field": schema.leaves(edge.value.var)[0].es_column} else: calc = {"script": edge.value.to_es_script(schema).script(schema)} return wrap({"aggs": { "_match": set_default( {"range": calc}, {"range": {"ranges": [{"from": to_float(p.min), "to": to_float(p.max)} for p in domain.partitions]}}, es_query ), "_missing": missing_filter }})
def append_query(self, es_query, start): self.start = start domain = self.domain domain_key = domain.key include, text_include = transpose( *((float(v) if isinstance(v, (int, float)) else v, text_type(float(v)) if isinstance(v, (int, float)) else v) for v in (p[domain_key] for p in domain.partitions))) value = self.edge.value exists = AndOp( "and", [value.exists(), InOp("in", [value, Literal("literal", include)])]).partial_eval() limit = coalesce(self.limit, len(domain.partitions)) if isinstance(value, Variable): es_field = first(self.query.frum.schema.leaves( value.var)).es_column # ALREADY CHECKED THERE IS ONLY ONE terms = set_default( { "terms": { "field": es_field, "size": limit, "order": { "_term": self.sorted } if self.sorted else None } }, es_query) else: terms = set_default( { "terms": { "script": value.to_es14_script(self.schema).script(self.schema), "size": limit } }, es_query) if self.edge.allowNulls: missing = set_default( {"filter": NotOp("not", exists).to_es14_filter(self.schema)}, es_query) else: missing = None return wrap({ "aggs": { "_match": { "filter": exists.to_es14_filter(self.schema), "aggs": { "_filter": terms } }, "_missing": missing } })
def append_query(self, es_query, start): self.start = start edge = self.edge range = edge.range domain = edge.domain aggs = {} for i, p in enumerate(domain.partitions): filter_ = AndOp("and", [ InequalityOp("lte", [range.min, Literal("literal", self.to_float(p.min))]), InequalityOp("gt", [range.max, Literal("literal", self.to_float(p.min))]) ]) aggs["_join_" + text_type(i)] = set_default( {"filter": filter_.to_esfilter(self.schema)}, es_query ) return wrap({"aggs": aggs})