2016-04-27 5 views
1

Dies ist leider Art von hässlich. Ich habe eine Zeichenfolge in einem Format geschrieben, das als Einschränkung zu einer Datenbank gesendet wird. Es sieht etwa so aus:Wie man einen String logischen Ausdruck zu ausführbarem Java-Datei Ausdruck konvertieren

String constraint = "((attr1 eq 1) OR (attr2 eq 5)) AND (attr3 BETWEEN (1, 5))" 

Ich brauche einen Weg, dies in einen Strom-Filter von Parsen, wie so aussehen:

stream.filter(obj -> 
    (obj.getAttr1() == 1 || obj.getAttr2() == 5) && (isBetween(obj.getAttr3(), 1, 5))) 

die isBetween Methode an anderer Stelle ist, ob der attr3 Wert bestimmen würde, ist zwischen 1 und 5. Gibt es eine einfache Möglichkeit, dies zu analysieren?

sollte es in Ordnung sein mehrere Filter zu haben, vielmehr ruft als sie alle in einem passt. Die Entscheidung, welche GetAttr zu können entlang der Linien in einer if-Anweisung erfolgen:

if (attr.equals("attr1")) { 
    obj.getAttr1(); 
} 

Antwort

1

Vielleicht möchten Sie in EvalEx suchen. Es ist ein allgemeiner Ausdruck Parser und Evaluator.

Sie können Ihre eigenen Betreiber, so „eq“, „und“ und „oder“ sollte kein Problem sein, definieren. Sie können Variablen, so „attr1“ erstellen und Freunden sollte kein Problem sein, entweder.

Dieses ist wahrscheinlich das Problem:

attr3 BETWEEN (1, 5) 

Nicht sicher, ob Sie einen Operator definieren, die mehrere Argumente auf der rechten Seite nehmen, oder eine Funktion, die einen Postfix-Operator zurückgibt. Aber der Quellcode verfügbar ist, so können Sie vielleicht hacken eine in.

Verwandte Themen