private boolean isNull(Expression expr) { if (expr instanceof Literal) { Literal literal = (Literal)expr; return literal.getValue() == null; } return false; }
public Literal createLiteral(Object value, Class<?> type) { return new Literal(value, type); }
@Override public void substitute(Argument arg, StringBuilder builder, int index) { Literal argumentValue = arg.getArgumentValue(); Object value = argumentValue.getValue(); if (value == null || value instanceof Number || value instanceof Boolean || value instanceof String) { builder.append(argumentValue); } else if (value instanceof Date) { //bind as a string literal builder.append(new Literal(value.toString(), String.class)); } else { //bind as a string literal using the teiid format - this is likely not what the user wants builder.append(new Literal(argumentValue.toString(), String.class)); } } });
@Override public List<?> translate(Function function) { Literal intervalType = (Literal)function.getParameters().get(0); String interval = ((String)intervalType.getValue()).toUpperCase(); if (interval.equals(NonReserved.SQL_TSI_FRAC_SECOND)) { intervalType.setValue("MICROSECOND"); //$NON-NLS-1$ return Arrays.asList(function, " * 1000"); //$NON-NLS-1$ } return null; } });
@Override public List<?> translate(Function function) { if (function.getParameters().size() > 1) { Expression ex = function.getParameters().get(0); if (ex.getType() == TypeFacility.RUNTIME_TYPES.DOUBLE || ex.getType() == TypeFacility.RUNTIME_TYPES.FLOAT) { if (function.getParameters().get(1) instanceof Literal && Integer.valueOf(0).equals(((Literal)function.getParameters().get(1)).getValue())) { function.getParameters().remove(1); } else { function.getParameters().set(0, new Function(SourceSystemFunctions.CONVERT, Arrays.asList(ex, new Literal("bigdecimal", TypeFacility.RUNTIME_TYPES.STRING)), TypeFacility.RUNTIME_TYPES.BIG_DECIMAL)); //$NON-NLS-1$ } } } return null; } });
if (l.getType() == TypeFacility.RUNTIME_TYPES.GEOMETRY && l.getValue() != null) { return translateGeometryLiteral(l); if (l.getType() == TypeFacility.RUNTIME_TYPES.GEOGRAPHY && l.getValue() != null) { return translateGeographyLiteral(l); if (c instanceof IsNull) { return Arrays.asList(new SearchedCase(Arrays.asList( new SearchedWhenClause(c, new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER))), new Literal(0, TypeFacility.RUNTIME_TYPES.INTEGER), TypeFacility.RUNTIME_TYPES.BOOLEAN)); new SearchedWhenClause(c, new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER)), new SearchedWhenClause(new Not(c), new Literal(0, TypeFacility.RUNTIME_TYPES.INTEGER))), null, TypeFacility.RUNTIME_TYPES.BOOLEAN));
/** * @see org.teiid.language.visitor.SQLStringVisitor#visit(org.teiid.language.Literal) */ public void visit(Literal obj) { if (this.prepared && ((replaceWithBinding && obj.isBindEligible()) || TranslatedCommand.isBindEligible(obj))) { addBinding(obj); } else { translateSQLType(obj.getType(), obj.getValue(), buffer); } }
/** * Adding a specific workaround for just Pheonix and BigDecimal. */ @Override public List<?> translate(LanguageObject obj, ExecutionContext context) { if (obj instanceof SubqueryIn) { SubqueryIn in = (SubqueryIn)obj; return Arrays.asList(new SubqueryComparison(in.getLeftExpression(), in.isNegated()?Operator.NE:Operator.EQ, in.isNegated()?Quantifier.ALL:Quantifier.SOME, in.getSubquery())); } if (!(obj instanceof Literal)) { return super.translate(obj, context); } Literal l = (Literal)obj; if (l.isBindEligible() || l.getType() != TypeFacility.RUNTIME_TYPES.BIG_DECIMAL) { return super.translate(obj, context); } BigDecimal bd = ((BigDecimal)l.getValue()); if (bd.scale() == 0) { l.setValue(bd.setScale(1)); } return null; }
public void visit(Literal obj) { if (!isUpdate()) { super.visit(obj); return; } if (obj.getValue() == null) { buffer.append(NULL); return; } Class<?> type = obj.getType(); if (Number.class.isAssignableFrom(type)) { buffer.append(obj.toString()); return; } else if (obj.getType().equals(DataTypeManager.DefaultDataClasses.DATE) || obj.getType().equals(DataTypeManager.DefaultDataClasses.BOOLEAN)) { buffer.append(obj.getValue().toString()); return; } else if (obj.getType().equals(DataTypeManager.DefaultDataClasses.TIME) || obj.getType().equals(DataTypeManager.DefaultDataClasses.TIMESTAMP)) { throw new SpreadsheetOperationException(SpreadsheetExecutionFactory.UTIL.gs("time_not_supported")); //$NON-NLS-1$ } else { buffer.append("\""); //$NON-NLS-1$ buffer.append(StringUtil.replace(obj.getValue().toString(), "\"", "\"\"")); //$NON-NLS-1$ //$NON-NLS-2$ buffer.append("\""); //$NON-NLS-1$ return; } }
@Override public void visit(Comparison obj) { if (isFixedChar(obj.getLeftExpression())) { if (obj.getRightExpression() instanceof Literal) { Literal l = (Literal)obj.getRightExpression(); l.setType(FixedCharType.class); } else if (obj.getRightExpression() instanceof Parameter) { Parameter p = (Parameter)obj.getRightExpression(); p.setType(FixedCharType.class); } } if (obj.getLeftExpression().getType() == TypeFacility.RUNTIME_TYPES.BOOLEAN && (obj.getLeftExpression() instanceof Function) && obj.getRightExpression() instanceof Literal) { Function f = (Function)obj.getLeftExpression(); if (STRING_BOOLEAN_FUNCTIONS.contains(f.getName())) { Boolean b = (Boolean)((Literal)obj.getRightExpression()).getValue(); obj.setRightExpression(new Literal(b!=null?(b?"TRUE":"FALSE"):null, TypeFacility.RUNTIME_TYPES.STRING)); //$NON-NLS-1$ //$NON-NLS-2$ } } super.visit(obj); }
public static void appendLiteralValue(StringBuilder result, Literal literal) { if (literal.getValue().getClass().equals(Boolean.class)) { result.append(((Boolean)literal.getValue()).toString()); } else if (literal.getValue().getClass().equals(java.sql.Timestamp.class)) { Timestamp datetime = (java.sql.Timestamp)literal.getValue(); String value = datetime.toString(); int fractionalPlace = value.lastIndexOf('.'); result.append(val/10); result.append(val%10); } else if (literal.getValue().getClass().equals(java.sql.Time.class)) { result.append(literal.getValue()).append(".000").append(Util.getDefaultTimeZoneString()); //$NON-NLS-1$ } else if (literal.getValue().getClass().equals(java.sql.Date.class)) { result.append(literal.getValue()); } else if (literal.getValue() instanceof Double) { Double doubleVal = (Double)literal.getValue(); double value = Math.abs(doubleVal.doubleValue()); if (value <= SCIENTIFIC_LOW || value >= SCIENTIFIC_HIGH) { result.append(BigDecimal.valueOf(doubleVal).toPlainString()); } else { result.append(literal.toString()); } else if (literal.getValue() instanceof Float) { Float floatVal = (Float)literal.getValue(); float value = Math.abs(floatVal); if (value <= SCIENTIFIC_LOW || value >= SCIENTIFIC_HIGH) { result.append(BigDecimal.valueOf(floatVal).toPlainString()); } else { result.append(literal.toString());
Literal result = new Literal(constant.getValue(), constant.getType()); result.setBindEligible(constant.isBindEligible()); return result;
/** * Typical constructor for an in/in out parameter * @param direction * @param type * @param metadataObject */ public Argument(Direction direction, Literal value, ProcedureParameter metadataObject) { this.direction = direction; this.argumentValue = value; this.metadataObject = metadataObject; if (value != null) { this.type = value.getType(); } }
private void generateMultiSelect( Function func, String funcName ) throws TranslatorException { List<Expression> expressions = func.getParameters(); validateFunction(expressions); Expression columnExpression = expressions.get(0); Column column = ((ColumnReference)columnExpression).getMetadataObject(); criteriaBuffer.add(column.getSourceName()); criteriaBuffer.add(SPACE); criteriaBuffer.add(funcName); criteriaBuffer.add(OPEN); String fullParam = ((Literal)expressions.get(1)).toString(); String[] params = fullParam.split(","); //$NON-NLS-1$ for (int i = 0; i < params.length; i++) { String token = params[i]; if (i != 0) { criteriaBuffer.add(COMMA); } criteriaBuffer.add(Util.addSingleQuotes(token)); } criteriaBuffer.add(CLOSE); }
@Test public void testBindings() throws Exception { BasicSourceCapabilities caps = TestOptimizer.getTypicalCapabilities(); caps.setCapabilitySupport(Capability.DEPENDENT_JOIN_BINDINGS, true); ProcessorPlan plan = TestOptimizer.helpPlan("select pm1.g1.e1, pm1.g1.e2, pm2.g1.e2 FROM pm1.g1, /*+ makedep */ pm2.g1 where (pm1.g1.e1 = pm2.g1.e1)", TestOptimizer.example1(), //$NON-NLS-1$ new String[] { "SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM pm1.g1 AS g_0 ORDER BY c_0", "SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM pm2.g1 AS g_0 WHERE g_0.e1 IN (<dependent values>) ORDER BY c_0" }, new DefaultCapabilitiesFinder(caps), TestOptimizer.ComparisonMode.EXACT_COMMAND_STRING ); //$NON-NLS-1$ //$NON-NLS-2$ List<?>[] expected = new List<?>[] { Arrays.asList(new Object[] { "a", 1, 2 }), //$NON-NLS-1$ }; HardcodedDataManager dataManager = new HardcodedDataManager(RealMetadataFactory.example1Cached()); dataManager.addData("SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM g1 AS g_0 ORDER BY c_0", new List<?>[] {Arrays.asList("a", 1)}); dataManager.addData("SELECT g_0.e1 AS c_0, g_0.e2 AS c_1 FROM g1 AS g_0 WHERE g_0.e1 = 'a' ORDER BY c_0", new List<?>[] {Arrays.asList("a", 2)}); TestProcessor.helpProcess(plan, dataManager, expected); Select select = (Select)dataManager.getPushdownCommands().get(1); assertTrue(((Literal)((Comparison)select.getWhere()).getRightExpression()).isBindEligible()); }
if (forLength instanceof Literal) { Literal l = (Literal)forLength; int value = (Integer)l.getValue(); isNegative = value < 0; Arrays.asList( length, new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER)), TypeFacility.RUNTIME_TYPES.INTEGER))), from, TypeFacility.RUNTIME_TYPES.INTEGER); Arrays.asList( adjustedFrom, new Literal(1, TypeFacility.RUNTIME_TYPES.INTEGER)), TypeFacility.RUNTIME_TYPES.INTEGER)), TypeFacility.RUNTIME_TYPES.INTEGER); Expression defaultExpr = null; if (isNegative == null) { clauses.add(new SearchedWhenClause(new Comparison(forLength, new Literal(0, TypeFacility.RUNTIME_TYPES.INTEGER), Operator.GT), forLength)); } else if (isNegative) { return Arrays.asList(new Literal(null, TypeFacility.RUNTIME_TYPES.STRING)); } else { defaultExpr = forLength;
Literal result = new Literal(constant.getValue(), constant.getType()); result.setBindEligible(constant.isBindEligible()); return result;