Ejemplo n.º 1
0
def to_painless(self, schema):
    if self.var == ".":
        return "_source"
    else:
        if self.var == "_id":
            return Painless(
                type=STRING,
                expr=
                'doc["_uid"].value.substring(doc["_uid"].value.indexOf(\'#\')+1)',
                frum=self)

        columns = schema.values(self.var)
        acc = []
        for c in columns:
            varname = c.es_column
            frum = Variable(c.es_column)
            q = quote(varname)
            acc.append(
                Painless(miss=frum.missing(),
                         type=c.type,
                         expr="doc[" + q + "].values",
                         frum=frum,
                         many=True))

        if len(acc) == 0:
            return NULL.to_painless(schema)
        elif len(acc) == 1:
            return acc[0]
        else:
            return CoalesceOp("coalesce", acc).to_painless(schema)
Ejemplo n.º 2
0
def to_painless(self, schema):
    if not self.terms:
        return NULL.to_painless(schema)

    v = self.terms[-1]
    acc = FirstOp("first", v).partial_eval().to_painless(schema)
    for v in reversed(self.terms[:-1]):
        m = v.missing().partial_eval()
        e = NotOp("not", m).partial_eval().to_painless(schema)
        r = FirstOp("first", v).partial_eval().to_painless(schema)

        if r.miss is TRUE:
            continue
        elif r.miss is FALSE:
            acc = r
            continue
        elif acc.type == r.type:
            new_type = r.type
        elif acc.type == NUMBER and r.type == INTEGER:
            new_type = NUMBER
        elif acc.type == INTEGER and r.type == NUMBER:
            new_type = NUMBER
        else:
            new_type = OBJECT

        acc = Painless(miss=AndOp("and", [acc.miss, m]).partial_eval(),
                       type=new_type,
                       expr="(" + e.expr + ") ? (" + r.expr + ") : (" +
                       acc.expr + ")",
                       frum=self)
    return acc
Ejemplo n.º 3
0
 def _convert(v):
     if v is None:
         return NULL.to_painless(schema)
     if v is True:
         return Painless(
             type=BOOLEAN,
             expr="true",
             frum=self
         )
     if v is False:
         return Painless(
             type=BOOLEAN,
             expr="false",
             frum=self
         )
     if isinstance(v, text_type):
         return Painless(
             type=STRING,
             expr=quote(v),
             frum=self
         )
     if isinstance(v, int):
         return Painless(
             type=INTEGER,
             expr=text_type(v),
             frum=self
         )
     if isinstance(v, float):
         return Painless(
             type=NUMBER,
             expr=text_type(v),
             frum=self
         )
     if isinstance(v, dict):
         return Painless(
             type=OBJECT,
             expr="[" + ", ".join(quote(k) + ": " + _convert(vv) for k, vv in v.items()) + "]",
             frum=self
         )
     if isinstance(v, (list, tuple)):
         return Painless(
             type=OBJECT,
             expr="[" + ", ".join(_convert(vv).expr for vv in v) + "]",
             frum=self
         )