@Override public List<?> translate(Function function) { if (Number.class.isAssignableFrom(function.getParameters().get(0).getType())) { return Arrays.asList("trunc(", function.getParameters().get(0), ")"); //$NON-NLS-1$ //$NON-NLS-2$ } return Arrays.asList("trunc(to_number(", function.getParameters().get(0), "))"); //$NON-NLS-1$ //$NON-NLS-2$ } },
private ColumnReference createTempColumn(int i, Expression ex) { if (ex instanceof ColumnReference) { ColumnReference left = (ColumnReference)ex; return new ColumnReference(null, COL_PREFIX + i, left.getMetadataObject(), ex.getType()); } //just an expression - there's a lot of metadata lost here return new ColumnReference(null, COL_PREFIX + i, null, ex.getType()); }
@Override public List<?> translate(Function function) { Expression booleanValue = function.getParameters().get(0); if (booleanValue instanceof Function) { Function nested = (Function)booleanValue; if (nested.getName().equalsIgnoreCase("convert") && Number.class.isAssignableFrom(nested.getParameters().get(0).getType())) { //$NON-NLS-1$ booleanValue = nested.getParameters().get(0); } } return Arrays.asList("CASE WHEN ", booleanValue, " = '0' THEN 'false' WHEN ", booleanValue, " IS NOT NULL THEN 'true' END"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }
@Override public List<?> translate(Function function) { Expression booleanValue = function.getParameters().get(0); if (booleanValue instanceof Function) { Function nested = (Function)booleanValue; if (nested.getName().equalsIgnoreCase("convert") && Number.class.isAssignableFrom(nested.getParameters().get(0).getType())) { //$NON-NLS-1$ booleanValue = nested.getParameters().get(0); } } return Arrays.asList("(CASE WHEN ", booleanValue, " IN ( '0', 'FALSE') THEN 0 WHEN ", booleanValue, " IS NOT NULL THEN 1 END)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ }
@Override public List<?> translate(LanguageObject obj, ExecutionContext context) { if (obj instanceof AggregateFunction) { AggregateFunction agg = (AggregateFunction)obj; if (agg.getParameters().size() == 1 && (agg.getName().equalsIgnoreCase(NonReserved.MIN) || agg.getName().equalsIgnoreCase(NonReserved.MAX)) && TypeFacility.RUNTIME_TYPES.BOOLEAN.equals(agg.getParameters().get(0).getType())) { return Arrays.asList("CAST(", agg.getName(), "(CAST(", agg.getParameters().get(0), " AS tinyint)) AS boolean)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } return super.translate(obj, context); }
@Override public Class<?> getType() { return query.getProjectedQuery().getDerivedColumns().get(0).getExpression().getType(); }
@Override public List<?> translate(Function function) { Expression ex = function.getParameters().get(0); if (ex.getType() == TypeFacility.RUNTIME_TYPES.DATE || ex.getType() == TypeFacility.RUNTIME_TYPES.TIME || (ex instanceof ColumnReference && "date".equalsIgnoreCase(((ColumnReference)ex).getMetadataObject().getNativeType())) //$NON-NLS-1$ || (!(ex instanceof ColumnReference) && !(ex instanceof Literal) && !(ex instanceof Function))) { ex = ConvertModifier.createConvertFunction(getLanguageFactory(), function.getParameters().get(0), TypeFacility.RUNTIME_NAMES.TIMESTAMP); function.getParameters().set(0, ex); } return super.translate(function); } }
/** * Informix doesn't provide min/max(boolean) */ @Override public List<?> translate(LanguageObject obj, ExecutionContext context) { if (obj instanceof AggregateFunction) { AggregateFunction agg = (AggregateFunction)obj; if (agg.getParameters().size() == 1 && (agg.getName().equalsIgnoreCase(NonReserved.MIN) || agg.getName().equalsIgnoreCase(NonReserved.MAX)) && TypeFacility.RUNTIME_TYPES.BOOLEAN.equals(agg.getParameters().get(0).getType())) { return Arrays.asList("cast(", agg.getName(), "(cast(", agg.getParameters().get(0), " as char)) as boolean)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } return super.translate(obj, context); }
/** * Hana doesn't provide min/max(boolean) */ @Override public List<?> translate(LanguageObject obj, ExecutionContext context) { if (obj instanceof AggregateFunction) { AggregateFunction agg = (AggregateFunction)obj; if (agg.getParameters().size() == 1 && (agg.getName().equalsIgnoreCase(NonReserved.MIN) || agg.getName().equalsIgnoreCase(NonReserved.MAX)) && TypeFacility.RUNTIME_TYPES.BOOLEAN.equals(agg.getParameters().get(0).getType())) { return Arrays.asList("cast(", agg.getName(), "(to_tinyint(", agg.getParameters().get(0), ")) as boolean)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } return super.translate(obj, context); }
@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; } });
/** * Get the column types of the output columns for this query * @return a Class[] containing the column names * @since 4.3 */ public Class<?>[] getColumnTypes() { List<DerivedColumn> selectSymbols = getProjectedQuery().getDerivedColumns(); Class<?>[] columnTypes = new Class[selectSymbols.size()]; int symbolIndex = 0; for (DerivedColumn column : selectSymbols) { columnTypes[symbolIndex++] = column.getExpression().getType(); } return columnTypes; }
@Override public List<?> translate(LanguageObject obj, ExecutionContext context) { if (obj instanceof DerivedColumn) { DerivedColumn selectSymbol = (DerivedColumn)obj; if (selectSymbol.getExpression().getType() == TypeFacility.RUNTIME_TYPES.XML) { if (selectSymbol.getAlias() == null) { return Arrays.asList("XMLSERIALIZE(", selectSymbol.getExpression(), " AS CLOB)"); //$NON-NLS-1$//$NON-NLS-2$ } //we're assuming that alias quoting shouldn't be needed return Arrays.asList("XMLSERIALIZE(", selectSymbol.getExpression(), " AS CLOB) AS ", selectSymbol.getAlias()); //$NON-NLS-1$//$NON-NLS-2$ } } return super.translate(obj, context); }
public void visit(Function obj) { FunctionMethod f = obj.getMetadataObject(); if (f != null) { String nativeQuery = f.getProperty(TEIID_NATIVE_QUERY, false); if (nativeQuery != null) { List<Argument> args = new ArrayList<Argument>(obj.getParameters().size()); for (Expression p : obj.getParameters()) { args.add(new Argument(Direction.IN, p, p.getType(), null)); } parseNativeQueryParts(nativeQuery, args, buffer, this); return; } } super.visit(obj); }
public void visit(Comparison obj) { boolean addNot = false; if ((!isUpdate() || obj.getLeftExpression().getType() != TypeFacility.RUNTIME_TYPES.STRING) && (obj.getOperator() == Operator.NE || obj.getOperator() == Operator.LT || obj.getOperator() == Operator.LE || (obj.getOperator() == Operator.EQ && !(obj.getRightExpression() instanceof Literal)))) { addNot = true; buffer.append("("); //$NON-NLS-1$ } super.visit(obj); if (addNot) { buffer.append(" AND "); //$NON-NLS-1$ visitNode(obj.getLeftExpression()); if (!isUpdate()) { buffer.append(" IS NOT NULL)"); //$NON-NLS-1$ } else { buffer.append(" <> \"\")"); //$NON-NLS-1$ } } }
public void visit(IsNull obj) { visit(new Comparison(obj.getExpression(), new Literal(null, obj.getExpression().getType()), obj.isNegated()?Comparison.Operator.NE:Comparison.Operator.EQ)); }
@Test public void testLongTimestampAddLongExpression() throws Exception { org.teiid.query.sql.symbol.Function ex = (org.teiid.query.sql.symbol.Function)TestFunctionResolving.getExpression("timestampadd(sql_tsi_second, cast(1 as long), now())"); Function f = (Function) TstLanguageBridgeFactory.factory.translate(ex); assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, f.getParameters().get(1).getType()); }
public void testGetType() throws Exception { Select query = TstLanguageBridgeFactory.factory.translate(TestQueryImpl.helpExample(true)); Class<?> firstSymbolType = query.getDerivedColumns().get(0).getExpression().getType(); assertEquals("Got incorrect type", firstSymbolType, example().getType()); //$NON-NLS-1$ }
@Test public void testLongTimestampAddLiteral1() throws Exception { org.teiid.query.sql.symbol.Function ex = (org.teiid.query.sql.symbol.Function)TestFunctionResolving.getExpression("timestampadd(sql_tsi_second, 1, now())"); ex.getArgs()[1] = new Constant(1l); Function f = (Function) TstLanguageBridgeFactory.factory.translate(ex); assertEquals(DataTypeManager.DefaultDataClasses.INTEGER, f.getParameters().get(1).getType()); }
private void addCast(String nativeType, DerivedColumn dc) { if (nativeType != null) { Function cast = ConvertModifier.createConvertFunction(getLanguageFactory(), dc.getExpression(), nativeType); cast.setName("cast"); //$NON-NLS-1$ dc.setExpression(cast); } else { dc.setExpression(ConvertModifier.createConvertFunction(getLanguageFactory(), dc.getExpression(), TypeFacility.getDataTypeName(dc.getExpression().getType()))); } }
@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); }