def is_deepop(es, query): if query.edges or query.groupby: return False if all(s.aggregate not in (None, "none") for s in listwrap(query.select)): return False vars = query_get_all_vars(query) columns = query.frum.get_columns() if len(split_field(query.frum.name)) > 1: return True if any(c for c in columns if c.nested_path and c.name in vars): return True return False
def __init__(self, query, schema=None): """ NORMALIZE QUERY SO IT CAN STILL BE JSON """ if isinstance(query, Query) or query == None: return object.__init__(self) query = wrap(query) self.format = query.format self.frum = wrap_from(query["from"], schema=schema) select = query.select if isinstance(select, list): names = set() new_select = [] for s in select: ns = _normalize_select(s, schema=schema) if ns.name in names: Log.error("two select have the same name") names.add(ns.name) new_select.append(unwrap(ns)) self.select = wrap(new_select) elif select: self.select = _normalize_select(select, schema=schema) else: if query.edges or query.groupby: self.select = Dict(name="count", value=".", aggregate="count") else: self.select = Dict(name=".", value=".", aggregate="none") if query.groupby and query.edges: Log.error("You can not use both the `groupby` and `edges` clauses in the same query!") elif query.edges: self.edges = _normalize_edges(query.edges, schema=schema) self.groupby = None elif query.groupby: self.edges = None self.groupby = _normalize_groupby(query.groupby, schema=schema) else: self.edges = [] self.groupby = None self.where = _normalize_where(query.where, schema=schema) self.window = [_normalize_window(w) for w in listwrap(query.window)] self.having = None self.sort = _normalize_sort(query.sort) self.limit = Math.min(MAX_LIMIT, coalesce(query.limit, DEFAULT_LIMIT)) if not Math.is_integer(self.limit) or self.limit < 0: Log.error("Expecting limit >= 0") self.isLean = query.isLean # DEPTH ANALYSIS - LOOK FOR COLUMN REFERENCES THAT MAY BE DEEPER THAN # THE from SOURCE IS. # TODO: IGNORE REACHING INTO THE NON-NESTED TYPES if isinstance(self.frum, list): if not qb: _late_import() columns = qb.get_columns(self.frum) elif isinstance(self.frum, Container): columns = self.frum.get_columns(table=self.frum.name) else: columns = [] query_path = coalesce(self.frum.query_path, ".") vars = query_get_all_vars(self, exclude_where=True) # WE WILL EXCLUDE where VARIABLES for c in columns: if c.name in vars and not query_path.startswith(coalesce(listwrap(c.nested_path)[0], "")): Log.error("This query, with variable {{var_name}} is too deep", var_name=c.name)