public void visit(CaseExpression caseExpression) throws Exception { if (caseExpression.getSwitchExpression() != null) { caseExpression.getSwitchExpression().accept(this); } if (caseExpression.getWhenClauses() != null) { for (Expression exp : caseExpression.getWhenClauses()) { exp.accept(this); } } if (caseExpression.getElseExpression() != null) { caseExpression.getElseExpression().accept(this); } }
private void putArithmeticOnStack( TermMap left, TermMap right, Class<? extends BinaryExpression> arithmeticOp) { try { BinaryExpression arithmetical = arithmeticOp.newInstance(); arithmetical.setLeftExpression(DataTypeHelper.uncast(right.getLiteralValNumeric())); arithmetical.setRightExpression(DataTypeHelper.uncast(left.getLiteralValNumeric())); // for division we always return decimal if (arithmeticOp.equals(Division.class)) { Expression datatype = dth.cast( new StringValue("'" + XSDDatatype.XSDdecimal.getURI() + "'"), dth.getStringCastType()); tms.push(tmf.createNumericalTermMap(arithmetical, datatype)); } else { // determine the datatype if (optConf.isShortcutFilters()) { // check if we can determine the datatype of both parameters Expression dtLeft = DataTypeHelper.uncast(left.getLiteralType()); Expression dtRight = DataTypeHelper.uncast(right.getLiteralType()); if (DataTypeHelper.constantValueExpressions.contains(dtLeft.getClass()) && DataTypeHelper.constantValueExpressions.contains(dtRight.getClass())) { if (dtLeft.toString().equals(dtRight.toString())) { // the same, so we use tms.push(tmf.createNumericalTermMap(arithmetical, dtLeft)); } else { // we just use decimal Expression datatype = dth.cast( new StringValue("'" + XSDDatatype.XSDdecimal.getURI() + "'"), dth.getStringCastType()); tms.push(tmf.createNumericalTermMap(arithmetical, datatype)); } return; } } // it was not possible to short, so create the dynamic datatype expression CaseExpression datatypeCase = new CaseExpression(); WhenClause datatypeEquals = new WhenClause(); EqualsTo datatypesAreEqualwhen = new EqualsTo(); datatypesAreEqualwhen.setLeftExpression(left.getLiteralType()); Expression datatypesEqualThen = left.getLiteralType(); datatypeEquals.setWhenExpression(datatypesAreEqualwhen); datatypeEquals.setThenExpression(datatypesEqualThen); Expression elseDataType = new StringValue("'" + XSDDatatype.XSDdecimal.getURI() + "'"); datatypeCase.setWhenClauses(Arrays.asList((Expression) datatypeEquals)); datatypeCase.setElseExpression(elseDataType); tms.push(tmf.createNumericalTermMap(arithmetical, datatypeCase)); } } catch (InstantiationException | IllegalAccessException e) { log.error("Error creating arithmetic operator", e); } }