
org.jpmml.python.PredicateTranslator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pmml-python Show documentation
Show all versions of pmml-python Show documentation
JPMML Python to PMML converter
/* PredicateTranslator.java */
/* Generated By:JavaCC: Do not edit this line. PredicateTranslator.java */
package org.jpmml.python;
import java.util.ArrayList;
import java.util.List;
import org.dmg.pmml.Apply;
import org.dmg.pmml.Array;
import org.dmg.pmml.CompoundPredicate;
import org.dmg.pmml.DataType;
import org.dmg.pmml.Expression;
import org.dmg.pmml.False;
import org.dmg.pmml.FieldRef;
import org.dmg.pmml.PMMLFunctions;
import org.dmg.pmml.Predicate;
import org.dmg.pmml.SimplePredicate;
import org.dmg.pmml.SimpleSetPredicate;
import org.dmg.pmml.True;
import org.jpmml.converter.Feature;
import org.jpmml.converter.PMMLUtil;
import org.jpmml.converter.TypeUtil;
import org.jpmml.converter.ValueUtil;
public class PredicateTranslator extends AbstractTranslator implements PythonParserConstants {
public PredicateTranslator(Scope scope){
this(new NullProvider());
setScope(scope);
}
public Predicate translatePredicate(String string){
ReInit(new StringProvider(string));
Predicate predicate;
try {
predicate = translatePredicateInternal();
} catch(ParseException pe){
throw new TranslationException("Python predicate \'" + string + "\' is either invalid or not supported", pe);
}
return predicate;
}
static
private SimplePredicate.Operator translateRelationalOperator(Token operator) throws ParseException {
switch(operator.kind){
case EQUAL:
return SimplePredicate.Operator.EQUAL;
case NOT_EQUAL:
return SimplePredicate.Operator.NOT_EQUAL;
case LESS_THAN:
return SimplePredicate.Operator.LESS_THAN;
case LESS_OR_EQUAL:
return SimplePredicate.Operator.LESS_OR_EQUAL;
case GREATER_THAN:
return SimplePredicate.Operator.GREATER_THAN;
case GREATER_OR_EQUAL:
return SimplePredicate.Operator.GREATER_OR_EQUAL;
default:
throw new ParseException();
}
}
static
private String getOnlyArgument(Apply apply){
List expressions = apply.getExpressions();
ClassDictUtil.checkSize(1, expressions);
FieldRef fieldRef = (FieldRef)expressions.get(0);
return fieldRef.requireField();
}
static
private Array createArray(List> values){
DataType dataType = TypeUtil.getDataType(values, DataType.STRING);
return PMMLUtil.createArray(dataType, values);
}
static
private SimplePredicate createSimplePredicate(Object left, SimplePredicate.Operator operator, Object right){
String name = asFieldName(left);
Object value = (right != null ? asValue(right) : null);
return new SimplePredicate(name, operator, value);
}
static
private SimpleSetPredicate createSimpleSetPredicate(Object left, SimpleSetPredicate.BooleanOperator booleanOperator, Object right){
String name = asFieldName(left);
Array array = (Array)right;
return new SimpleSetPredicate(name, booleanOperator, array);
}
static
private CompoundPredicate createCompoundPredicate(Predicate left, CompoundPredicate.BooleanOperator booleanOperator, Predicate right){
if(left instanceof CompoundPredicate){
CompoundPredicate compoundPredicate = (CompoundPredicate)left;
if(compoundPredicate.requireBooleanOperator() == booleanOperator){
compoundPredicate.addPredicates(right);
return compoundPredicate;
}
}
CompoundPredicate compoundPredicate = new CompoundPredicate(booleanOperator, null)
.addPredicates(left, right);
return compoundPredicate;
}
static
private String asFieldName(Object object){
if(object instanceof Feature){
Feature feature = (Feature)object;
return feature.getName();
} else
if(object instanceof FieldRef){
FieldRef fieldRef = (FieldRef)object;
return fieldRef.requireField();
} else
{
throw new TranslationException("The left-hand side of the predicate (" + object + ") is not a feature reference");
}
}
static
private Object asValue(Object object){
if(object instanceof Boolean){
return (Boolean)object;
} else
if(object instanceof Integer){
return (Integer)object;
} else
if(object instanceof Double){
return (Double)object;
} else
if(object instanceof String){
return (String)object;
} else
{
throw new TranslationException("The right-hand side of the predicate (" + object + ") is not a value");
}
}
static
private Predicate asPredicate(Object object){
if(object instanceof Predicate){
Predicate predicate = (Predicate)object;
return predicate;
} // End if
if(object instanceof Apply){
Apply apply = (Apply)object;
switch(apply.requireFunction()){
case PMMLFunctions.ISMISSING:
return new SimplePredicate(getOnlyArgument(apply), SimplePredicate.Operator.IS_MISSING, null);
case PMMLFunctions.ISNOTMISSING:
return new SimplePredicate(getOnlyArgument(apply), SimplePredicate.Operator.IS_NOT_MISSING, null);
default:
break;
}
} // End if
if(object instanceof Feature){
Feature feature = (Feature)object;
if(feature.getDataType() == DataType.BOOLEAN){
return new SimplePredicate(feature.getName(), SimplePredicate.Operator.EQUAL, Boolean.TRUE);
}
} // End if
if((Boolean.FALSE).equals(object)){
return False.INSTANCE;
} else
if((Boolean.TRUE).equals(object)){
return True.INSTANCE;
} // End if
throw new TranslationException("The expression (" + object + ") is not a predicate");
}
static
private Object asArgument(Object object){
if(object instanceof Feature){
Feature feature = (Feature)object;
return feature;
} else
{
throw new TranslationException("The function argument (" + object + ") is not a feature reference");
}
}
final private Token String() throws ParseException {Token token;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case STRING:{
token = jj_consume_token(STRING);
break;
}
case MULTILINE_STRING:{
token = jj_consume_token(MULTILINE_STRING);
break;
}
default:
jj_la1[0] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
return token;
}
final private Token Sign() throws ParseException {Token token;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS:{
token = jj_consume_token(PLUS);
break;
}
case MINUS:{
token = jj_consume_token(MINUS);
break;
}
default:
jj_la1[1] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
return token;
}
final private int ColumnIndex() throws ParseException {Token sign = null;
Token column;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS:
case MINUS:{
sign = Sign();
break;
}
default:
jj_la1[2] = jj_gen;
;
}
column = jj_consume_token(INT);
return PythonParserUtil.parseInt(sign, column);
}
final private int ArrayColumnIndex() throws ParseException {int columnIndex;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case COLON:{
jj_consume_token(COLON);
jj_consume_token(COMMA);
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LBRACKET:{
jj_consume_token(LBRACKET);
columnIndex = ColumnIndex();
jj_consume_token(RBRACKET);
break;
}
case PLUS:
case MINUS:
case INT:{
columnIndex = ColumnIndex();
break;
}
default:
jj_la1[3] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
break;
}
case PLUS:
case MINUS:
case INT:{
columnIndex = ColumnIndex();
break;
}
default:
jj_la1[4] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
return columnIndex;
}
final private String ColumnName() throws ParseException {Token column;
column = String();
return PythonParserUtil.parseString(column);
}
final private String DottedName() throws ParseException {Token name;
StringBuilder sb = new StringBuilder();
name = jj_consume_token(NAME);
sb.append(name.image);
label_1:
while (true) {
if (jj_2_1(2147483647)) {
;
} else {
break label_1;
}
jj_consume_token(DOT);
name = jj_consume_token(NAME);
sb.append('.').append(name.image);
}
return sb.toString();
}
final private String CanonicalizedDottedName() throws ParseException {String dottedName;
dottedName = DottedName();
return canonicalizeDottedName(dottedName);
}
final private Predicate translatePredicateInternal() throws ParseException {Predicate predicate;
predicate = Predicate();
jj_consume_token(0);
return predicate;
}
final private Predicate Predicate() throws ParseException {Predicate predicate;
predicate = LogicalOrExpression();
return predicate;
}
final private Predicate LogicalOrExpression() throws ParseException {Predicate left;
Predicate right;
left = LogicalAndExpression();
label_2:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case OR:{
;
break;
}
default:
jj_la1[5] = jj_gen;
break label_2;
}
jj_consume_token(OR);
right = LogicalAndExpression();
left = createCompoundPredicate(left, CompoundPredicate.BooleanOperator.OR, right);
}
return left;
}
final private Predicate LogicalAndExpression() throws ParseException {Predicate left;
Predicate right;
left = ComparisonExpression();
label_3:
while (true) {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case AND:{
;
break;
}
default:
jj_la1[6] = jj_gen;
break label_3;
}
jj_consume_token(AND);
right = ComparisonExpression();
left = createCompoundPredicate(left, CompoundPredicate.BooleanOperator.AND, right);
}
return left;
}
final private Predicate ComparisonExpression() throws ParseException {Object left;
Token operator = null;
Object right;
left = PrimaryExpression();
if (jj_2_2(2147483647)) {
jj_consume_token(IS);
jj_consume_token(NONE);
left = createSimplePredicate(left, SimplePredicate.Operator.IS_MISSING, null);
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case IS:{
jj_consume_token(IS);
jj_consume_token(NOT);
jj_consume_token(NONE);
left = createSimplePredicate(left, SimplePredicate.Operator.IS_NOT_MISSING, null);
break;
}
case IN:{
jj_consume_token(IN);
right = ListMakerExpression();
left = createSimpleSetPredicate(left, SimpleSetPredicate.BooleanOperator.IS_IN, right);
break;
}
case NOT:{
jj_consume_token(NOT);
jj_consume_token(IN);
right = ListMakerExpression();
left = createSimpleSetPredicate(left, SimpleSetPredicate.BooleanOperator.IS_NOT_IN, right);
break;
}
case EQUAL:
case NOT_EQUAL:
case LESS_THAN:
case LESS_OR_EQUAL:
case GREATER_THAN:
case GREATER_OR_EQUAL:{
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case EQUAL:{
operator = jj_consume_token(EQUAL);
break;
}
case NOT_EQUAL:{
operator = jj_consume_token(NOT_EQUAL);
break;
}
case LESS_THAN:{
operator = jj_consume_token(LESS_THAN);
break;
}
case LESS_OR_EQUAL:{
operator = jj_consume_token(LESS_OR_EQUAL);
break;
}
case GREATER_THAN:{
operator = jj_consume_token(GREATER_THAN);
break;
}
case GREATER_OR_EQUAL:{
operator = jj_consume_token(GREATER_OR_EQUAL);
break;
}
default:
jj_la1[7] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
right = UnaryExpression();
left = createSimplePredicate(left, translateRelationalOperator(operator), right);
break;
}
default:
jj_la1[8] = jj_gen;
left = asPredicate(left);
}
}
return (Predicate)left;
}
final private Object UnaryExpression() throws ParseException {Token sign = null;
Object result;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case PLUS:
case MINUS:{
sign = Sign();
result = UnaryExpression();
break;
}
case LPAREN:
case FALSE:
case TRUE:
case INT:
case FLOAT:
case NAME:
case STRING:
case MULTILINE_STRING:{
result = PrimaryExpression();
break;
}
default:
jj_la1[9] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
if(sign != null && sign.kind == MINUS){
result = ValueUtil.toNegative(asValue(result));
}
return result;
}
final private Object PrimaryExpression() throws ParseException {String dottedName;
Object result;
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case NAME:{
dottedName = CanonicalizedDottedName();
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LBRACKET:{
result = ArrayIndexingExpression(dottedName);
break;
}
case LPAREN:{
result = FunctionInvocationExpression(dottedName);
break;
}
default:
jj_la1[10] = jj_gen;
result = NameInvocationExpression(dottedName);
}
break;
}
case LPAREN:{
result = ParenthesizedExpression();
break;
}
case FALSE:
case TRUE:
case INT:
case FLOAT:
case STRING:
case MULTILINE_STRING:{
result = LiteralExpression();
break;
}
default:
jj_la1[11] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
return result;
}
final private Feature ArrayIndexingExpression(String dottedName) throws ParseException {Scope scope = ensureScope();
int colIndex;
String colName;
Feature feature;
if (jj_2_3(2147483647)) {
jj_consume_token(LBRACKET);
colIndex = ArrayColumnIndex();
jj_consume_token(RBRACKET);
feature = scope.getFeature(dottedName, colIndex);
} else {
switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
case LBRACKET:{
jj_consume_token(LBRACKET);
colName = ColumnName();
jj_consume_token(RBRACKET);
feature = scope.getFeature(dottedName, colName);
break;
}
default:
jj_la1[12] = jj_gen;
jj_consume_token(-1);
throw new ParseException();
}
}
return feature;
}
final private Object FunctionInvocationExpression(String dottedName) throws ParseException {List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy