Exemple #1
0
    def to_sql(self, schema, not_null=False, boolean=False):
        field = self.field.to_sql(schema)[0].sql
        acc = []
        for t, v in field.items():
            if t in "bns":
                acc.append(sql_iso(v + SQL_IS_NOT_NULL))

        if not acc:
            return wrap([{"name": ".", "sql": {"b": SQL_FALSE}}])
        else:
            return wrap([{"name": ".", "sql": {"b": SQL_OR.join(acc)}}])
Exemple #2
0
 def to_bq(self, schema, not_null=False, boolean=False):
     if not is_op(self.superset, Literal):
         Log.error("Not supported")
     j_value = json2value(self.superset.json)
     if j_value:
         var = BQLang[self.value].to_bq(schema)
         sql = SQL_OR.join(
             sql_iso(ConcatSQL(v, SQL_IN, quote_list(j_value)))
             for t, v in var[0].sql.items())
     else:
         sql = SQL_FALSE
     return wrap([{"name": ".", "sql": {"b": sql}}])
Exemple #3
0
    def to_bq(self, schema, not_null=False, boolean=False):
        lhs = BQLang[self.lhs].to_bq(schema)
        rhs = BQLang[self.rhs].to_bq(schema)
        acc = []
        if len(lhs) != len(rhs):
            Log.error("lhs and rhs have different dimensionality!?")

        for l, r in zip(lhs, rhs):
            for t in "bsnj":
                if l.sql[t] == None:
                    if r.sql[t] == None:
                        pass
                    else:
                        acc.append(sql_iso(r.sql[t]) + SQL_IS_NULL)
                elif l.sql[t] is ZERO:
                    if r.sql[t] == None:
                        acc.append(SQL_FALSE)
                    elif r.sql[t] is ZERO:
                        Log.error(
                            "Expecting expression to have been simplified already"
                        )
                    else:
                        acc.append(r.sql[t])
                else:
                    if r.sql[t] == None:
                        acc.append(sql_iso(l.sql[t]) + SQL_IS_NULL)
                    elif r.sql[t] is ZERO:
                        acc.append(l.sql[t])
                    else:
                        acc.append(
                            sql_iso(l.sql[t]) + " = " + sql_iso(r.sql[t]))
        if not acc:
            return FALSE.to_bq(schema)
        else:
            return BQLScript(
                expr=SQL_OR.join(acc),
                frum=self,
                data_type=BOOLEAN,
                miss=FALSE,
                schema=schema,
            )
Exemple #4
0
 if query_edge.value:
     domain = SQL_UNION_ALL.join(
         SQL_SELECT + sql_alias(
             quote_value(coalesce(p.dataIndex, i)), "rownum") +
         SQL_COMMA +
         sql_alias(quote_value(p.value), domain_name)
         for i, p in enumerate(query_edge.domain.partitions))
     if query_edge.allowNulls:
         domain += (SQL_UNION_ALL + SQL_SELECT + sql_alias(
             quote_value(len(query_edge.domain.partitions)),
             "rownum") + SQL_COMMA +
                    sql_alias(SQL_NULL, domain_name))
     where = None
     join_type = SQL_LEFT_JOIN if query_edge.allowNulls else SQL_INNER_JOIN
     on_clause = (SQL_OR.join(
         quote_column(edge_alias, k) + SQL_EQ + v
         for k, v in zip(domain_names, vals)) + SQL_OR +
                  sql_iso(
                      quote_column(edge_alias, domain_name) +
                      SQL_IS_NULL + SQL_AND +
                      SQL_AND.join(v + SQL_IS_NULL
                                   for v in vals)))
     null_on_clause = None
 else:
     domain = SQL_UNION_ALL.join(
         SQL_SELECT + sql_alias(quote_value(pp), domain_name)
         for pp, p in enumerate(query_edge.domain.partitions))
     where = None
     join_type = SQL_LEFT_JOIN if query_edge.allowNulls else SQL_INNER_JOIN
     on_clause = SQL_AND.join(
         quote_column(edge_alias, k) + SQL_EQ + sql
Exemple #5
0
def _esfilter2sqlwhere(esfilter):
    """
    CONVERT ElassticSearch FILTER TO SQL FILTER
    db - REQUIRED TO PROPERLY QUOTE VALUES AND COLUMN NAMES
    """
    esfilter = wrap(esfilter)

    if esfilter is True:
        return SQL_TRUE
    elif esfilter["and"]:
        return sql_iso(
            SQL_AND.join([esfilter2sqlwhere(a) for a in esfilter["and"]]))
    elif esfilter["or"]:
        return sql_iso(
            SQL_OR.join([esfilter2sqlwhere(a) for a in esfilter["or"]]))
    elif esfilter["not"]:
        return SQL_NOT + sql_iso(esfilter2sqlwhere(esfilter["not"]))
    elif esfilter.term:
        return sql_iso(
            SQL_AND.join([
                quote_column(col) + SQL("=") + quote_value(val)
                for col, val in esfilter.term.items()
            ]))
    elif esfilter.eq:
        col, val = first(esfilter.eq.items())
        return ConcatSQL(quote_column(col), SQL_EQ, quote_value(val))
    elif esfilter.terms:
        for col, v in esfilter.terms.items():
            if len(v) == 0:
                return "FALSE"

            try:
                int_list = convert.value2intlist(v)
                has_null = any(vv == None for vv in v)
                if int_list:
                    filter = int_list_packer(col, int_list)
                    if has_null:
                        return esfilter2sqlwhere(
                            {"or": [{
                                "missing": col
                            }, filter]})
                    elif 'terms' in filter and set(filter['terms'].get(
                            col, [])) == set(int_list):
                        return quote_column(col) + " in " + quote_list(
                            int_list)
                    else:
                        return esfilter2sqlwhere(filter)
                else:
                    if has_null:
                        return esfilter2sqlwhere({"missing": col})
                    else:
                        return "false"
            except Exception as e:
                e = Except.wrap(e)
                pass
            return quote_column(col) + " in " + quote_list(v)
    elif esfilter.script:
        return sql_iso(esfilter.script)
    elif esfilter.gt:
        k, v = first(esfilter.gt.items())
        return ConcatSQL(quote_column(k), SQL_GT, quote_value(v))
    elif esfilter.range:
        name2sign = {
            "gt": SQL(">"),
            "gte": SQL(">="),
            "lte": SQL("<="),
            "lt": SQL("<")
        }

        def single(col, r):
            min = coalesce(r["gte"], r[">="])
            max = coalesce(r["lte"], r["<="])
            if min != None and max != None:
                # SPECIAL CASE (BETWEEN)
                sql = quote_column(col) + SQL(" BETWEEN ") + quote_value(
                    min) + SQL_AND + quote_value(max)
            else:
                sql = SQL_AND.join(
                    quote_column(col) + name2sign[sign] + quote_value(value)
                    for sign, value in r.items())
            return sql

        terms = [single(col, ranges) for col, ranges in esfilter.range.items()]
        if len(terms) == 1:
            output = terms[0]
        else:
            output = sql_iso(SQL_AND.join(terms))
        return output
    elif esfilter.missing:
        if isinstance(esfilter.missing, text):
            return sql_iso(quote_column(esfilter.missing) + SQL_IS_NULL)
        else:
            return sql_iso(quote_column(esfilter.missing.field) + SQL_IS_NULL)
    elif esfilter.exists:
        if isinstance(esfilter.exists, text):
            return sql_iso(quote_column(esfilter.exists) + SQL_IS_NOT_NULL)
        else:
            return sql_iso(
                quote_column(esfilter.exists.field) + SQL_IS_NOT_NULL)
    elif esfilter.match_all:
        return SQL_TRUE
    elif esfilter.instr:
        return sql_iso(
            SQL_AND.join([
                "instr" +
                sql_iso(quote_column(col) + ", " + quote_value(val)) + ">0"
                for col, val in esfilter.instr.items()
            ]))
    else:
        Log.error("Can not convert esfilter to SQL: {{esfilter}}",
                  esfilter=esfilter)
Exemple #6
0
         SQL_SELECT +
         sql_alias(quote_value(coalesce(p.dataIndex, i)), "rownum") + SQL_COMMA +
         sql_alias(quote_value(p.value), domain_name)
         for i, p in enumerate(query_edge.domain.partitions)
     )
     if query_edge.allowNulls:
         domain += (
             SQL_UNION_ALL + SQL_SELECT +
             sql_alias(quote_value(len(query_edge.domain.partitions)), "rownum") + SQL_COMMA +
             sql_alias(SQL_NULL, domain_name)
         )
     where = None
     join_type = SQL_LEFT_JOIN if query_edge.allowNulls else SQL_INNER_JOIN
     on_clause = (
         SQL_OR.join(
             quote_column(edge_alias, k) + SQL_EQ + v
             for k, v in zip(domain_names, vals)
         ) +
         SQL_OR + sql_iso(
             quote_column(edge_alias, domain_name) + SQL_IS_NULL + SQL_AND +
             SQL_AND.join(v + SQL_IS_NULL for v in vals)
         )
     )
     null_on_clause = None
 else:
     domain = SQL_UNION_ALL.join(
         SQL_SELECT + sql_alias(quote_value(pp), domain_name)
         for pp, p in enumerate(query_edge.domain.partitions)
     )
     where = None
     join_type = SQL_LEFT_JOIN if query_edge.allowNulls else SQL_INNER_JOIN
     on_clause = SQL_AND.join(