@Override public void visit(Array array) { buffer.append(Tokens.LPAREN); append(array.getExpressions()); if (array.getExpressions().size() == 1) { buffer.append(Tokens.COMMA); } buffer.append(Tokens.RPAREN); }
@Override public List<?> translate(Function function) { List<Expression> args = function.getParameters(); Expression north = args.get(1); Expression east = args.get(2); Expression west = args.get(3); Expression south = args.get(4); ArrayList<Expression> points = new ArrayList<Expression>(); points.add(new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, Arrays.asList(west, north))); points.add(new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, Arrays.asList(east, north))); points.add(new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, Arrays.asList(east, south))); points.add(new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, Arrays.asList(west, south))); points.add(new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, Arrays.asList(west, north))); Expression coordinates = new org.teiid.language.Array(TypeFacility.RUNTIME_TYPES.DOUBLE, points); Function func = LanguageFactory.INSTANCE.createFunction(this.functionName, Arrays.asList(args.get(0), LanguageFactory.INSTANCE.createLiteral("Polygon", TypeFacility.RUNTIME_TYPES.STRING), //$NON-NLS-1$ coordinates ), Boolean.class); return Arrays.asList(func); } }
@Override public void visit(Array array) { boolean allLiterals = true; Class<?> baseType = array.getBaseType(); //the pg driver expects only values that are convertible to string //we could introduce some conversions, but for now we'll just fail //some cases- there's also potential issue with date time as this logic //won't consider the database timezone setting if (!baseType.isArray() && postgreSQLExecutionFactory.convertModifier.getSimpleTypeMapping(ConvertModifier.getCode(baseType)) != null) { for (Expression ex : array.getExpressions()) { if (!(ex instanceof Literal)) { allLiterals = false; break; } } if (allLiterals) { //TODO: this could be pushed to the language bridge factory //to just push a literal array addBinding(new Literal(array, array.getType())); return; } } //mixed or lob case //TODO: if this is used in the context specifically of an array, rather than //a row value, then this will fail super.visit(array); }
@Override public void bindValue(PreparedStatement stmt, Object param, Class<?> paramType, int i) throws SQLException { if (param == null && (paramType == TypeFacility.RUNTIME_TYPES.BLOB || paramType == TypeFacility.RUNTIME_TYPES.GEOMETRY || paramType == TypeFacility.RUNTIME_TYPES.GEOGRAPHY)) { //the blob sql type causes a failure with nulls paramType = TypeFacility.RUNTIME_TYPES.VARBINARY; } else if (param instanceof Array) { //pg allows for the direct binding of certain arrays Array array = (Array)param; Connection c = stmt.getConnection(); int code = ConvertModifier.getCode(array.getBaseType()); String nativeType = convertModifier.getSimpleTypeMapping(code); int index = nativeType.indexOf('('); if (index > 0) { nativeType = nativeType.substring(0, index); } Object[] values = new Object[array.getExpressions().size()]; for (int j = 0; j < values.length; j++) { Expression ex = array.getExpressions().get(j); values[j] = ((Literal)ex).getValue(); } java.sql.Array value = c.createArrayOf(nativeType, values); stmt.setArray(i, value); return; } super.bindValue(stmt, param, paramType, i); }
@Test public void testGetBaseType() throws Exception { Array array = example(null, "a"); //$NON-NLS-1$ assertEquals(String.class, array.getBaseType()); }
@Override public void visit(Array array) { visitNodes(array.getExpressions()); }
org.teiid.language.Array translate(Array array) { return new org.teiid.language.Array(array.getComponentType(), translateExpressionList(array.getExpressions())); }
@Override public void visit(Array array) { List<Expression> exprs = array.getExpressions(); append(exprs.get(0)); for (int i = 1; i < exprs.size(); i++) { buffer.append(Tokens.SPACE).append(AndOr.Operator.OR).append(Tokens.SPACE); buffer.append(SimpleDBMetadataProcessor.getQuotedName(this.previousColumn)); buffer.append(Tokens.SPACE).append(Tokens.EQ).append(Tokens.SPACE); append(exprs.get(i)); } }
org.teiid.language.Array translate(Array array) { return new org.teiid.language.Array(array.getComponentType(), translateExpressionList(array.getExpressions())); }
@Override public void visit(Array array) { append(array.getExpressions()); BasicDBList values = new BasicDBList(); for (int i = 0; i < array.getExpressions().size(); i++) { values.add(0, this.onGoingExpression.pop()); } this.onGoingExpression.push(values); }
org.teiid.language.Array translate(Array array) { return new org.teiid.language.Array(array.getComponentType(), translateExpressionList(array.getExpressions())); }
static String[] getValuesArray(Array array) throws TranslatorException { String[] result = new String[array.getExpressions().size()]; for (int j = 0; j < array.getExpressions().size(); j++) { Expression expr = array.getExpressions().get(j); if (expr instanceof Literal){ Literal lit = (Literal) expr; result[j] = (String)SimpleDBDataTypeManager.convertToSimpleDBType(lit.getValue(), lit.getType()); } else { new TranslatorException(SimpleDBPlugin.Event.TEIID24001, SimpleDBPlugin.Util.gs(SimpleDBPlugin.Event.TEIID24001)); } } return result; } }
org.teiid.language.Comparison translate(DependentSetCriteria criteria) { Operator operator = Operator.EQ; org.teiid.language.Expression arg = null; final TupleBuffer tb = criteria.getDependentValueSource().getTupleBuffer(); if (criteria.getValueExpression() instanceof Array) { Array array = (Array)criteria.getValueExpression(); List<org.teiid.language.Expression> params = new ArrayList<org.teiid.language.Expression>(); Class<?> baseType = null; for (Expression ex : array.getExpressions()) { if (baseType == null) { baseType = ex.getType(); } else if (!baseType.equals(ex.getType())) { baseType = DataTypeManager.DefaultDataClasses.OBJECT; } params.add(createParameter(criteria, tb, ex)); } arg = new org.teiid.language.Array(baseType, params); } else { Expression ex = criteria.getValueExpression(); arg = createParameter(criteria, tb, ex); } if (this.dependentSets == null) { this.dependentSets = new HashMap<String, List<? extends List<?>>>(); } this.dependentSets.put(criteria.getContextSymbol(), new TupleBufferList(tb)); Comparison result = new org.teiid.language.Comparison(translate(criteria.getExpression()), arg, operator); return result; }
private void addArgumentValue(String argName, Array value, String collectionFormat, StringBuilder queryStr) { List<Expression> exprs = value.getExpressions();
org.teiid.language.Comparison translate(DependentSetCriteria criteria) { Operator operator = Operator.EQ; org.teiid.language.Expression arg = null; final TupleBuffer tb = criteria.getDependentValueSource().getTupleBuffer(); if (criteria.getValueExpression() instanceof Array) { Array array = (Array)criteria.getValueExpression(); List<org.teiid.language.Expression> params = new ArrayList<org.teiid.language.Expression>(); Class<?> baseType = null; for (Expression ex : array.getExpressions()) { if (baseType == null) { baseType = ex.getType(); } else if (!baseType.equals(ex.getType())) { baseType = DataTypeManager.DefaultDataClasses.OBJECT; } params.add(createParameter(criteria, tb, ex)); } arg = new org.teiid.language.Array(baseType, params); } else { Expression ex = criteria.getValueExpression(); arg = createParameter(criteria, tb, ex); } if (this.dependentSets == null) { this.dependentSets = new HashMap<String, List<? extends List<?>>>(); } this.dependentSets.put(criteria.getContextSymbol(), new TupleBufferList(tb)); Comparison result = new org.teiid.language.Comparison(translate(criteria.getExpression()), arg, operator); return result; }
json.writeArrayFieldStart(key); org.teiid.language.Array array = (org.teiid.language.Array)value; for (Expression expr:array.getExpressions()) { writeProperty(json, ((Literal)expr).getValue());
org.teiid.language.Comparison translate(DependentSetCriteria criteria) { Operator operator = Operator.EQ; org.teiid.language.Expression arg = null; final TupleBuffer tb = criteria.getDependentValueSource().getTupleBuffer(); if (criteria.getValueExpression() instanceof Array) { Array array = (Array)criteria.getValueExpression(); List<org.teiid.language.Expression> params = new ArrayList<org.teiid.language.Expression>(); Class<?> baseType = null; for (Expression ex : array.getExpressions()) { if (baseType == null) { baseType = ex.getType(); } else if (!baseType.equals(ex.getType())) { baseType = DataTypeManager.DefaultDataClasses.OBJECT; } params.add(createParameter(criteria, tb, ex)); } arg = new org.teiid.language.Array(baseType, params); } else { Expression ex = criteria.getValueExpression(); arg = createParameter(criteria, tb, ex); } if (this.dependentSets == null) { this.dependentSets = new HashMap<String, List<? extends List<?>>>(); } this.dependentSets.put(criteria.getContextSymbol(), new TupleBufferList(tb)); Comparison result = new org.teiid.language.Comparison(translate(criteria.getExpression()), arg, operator); return result; }
private Object resolveExpressionValue(Expression expr) throws TranslatorException { Object value = null; if (expr instanceof Literal) { value = ((Literal)expr).getValue(); } else if (expr instanceof org.teiid.language.Array) { org.teiid.language.Array contents = (org.teiid.language.Array)expr; List<Expression> arrayExprs = contents.getExpressions(); List<Object> values = new ArrayList<Object>(); for (Expression exp:arrayExprs) { if (exp instanceof Literal) { values.add(((Literal)exp).getValue()); } else { this.exceptions.add(new TranslatorException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID17029))); } } value = values; } else { this.exceptions.add(new TranslatorException(ODataPlugin.Util.gs(ODataPlugin.Event.TEIID17029))); } return value; }
return new org.teiid.language.Array(baseType, translateExpressionList(vals));
} else if (comp.getRightExpression() instanceof Array) { Array array = (Array)comp.getRightExpression(); if (array.getExpressions().get(0) instanceof Parameter) { iter.remove(); p = (Parameter)array.getExpressions().get(0); if (ex instanceof Array) { Array array = (Array)ex; params.addAll(((Array)comp.getRightExpression()).getExpressions()); for (Expression expr : array.getExpressions()) { cols.add(createTempColumn(cols.size()+1, expr)); if (ex instanceof Array) { Array array = (Array)ex; for (Expression expr : array.getExpressions()) { conditions.add(new Comparison(expr, new ColumnReference(table, COL_PREFIX+i++, null, expr.getType()), Comparison.Operator.EQ));