private void encodeMultipleValueJoin( FeatureTypeMapping rootMapping, String rootTableName, JDBCDataStore store, StringBuffer sql) { for (AttributeMapping attributeMapping : rootMapping.getAttributeMappings()) { if (!(attributeMapping.getMultipleValue() instanceof JdbcMultipleValue)) { continue; } JdbcMultipleValue multipleValue = (JdbcMultipleValue) attributeMapping.getMultipleValue(); sql.append(" LEFT JOIN "); String alias = String.valueOf(multipleValue.getId()); try { store.encodeAliasedTableName(multipleValue.getTargetTable(), sql, null, alias); } catch (SQLException e) { throw new RuntimeException(e); } sql.append(" ON "); store.dialect.encodeColumnName(rootTableName, sql); sql.append("."); store.dialect.encodeColumnName(multipleValue.getSourceColumn(), sql); sql.append(" = "); store.dialect.encodeTableName(alias, sql); sql.append("."); store.dialect.encodeColumnName(multipleValue.getTargetColumn(), sql); sql.append(" "); } }
@Override protected Expression visit(Expression expression, Object extraData) { if (!(expression instanceof JdbcMultipleValue)) { return super.visit(expression, extraData); } JdbcMultipleValue multipleValue = (JdbcMultipleValue) expression; FilterToSQL filterToSql = createFilterToSQL(multipleValue); filterToSql.setFieldEncoder( field -> { StringBuffer sql = new StringBuffer(); store.dialect.encodeTableName(multipleValue.getId(), sql); sql.append("."); sql.append(field); return sql.toString(); }); try { return new MultipleValueExpressionHolder( output, filterToSql.encodeToString(((JdbcMultipleValue) expression).getTargetValue())); } catch (FilterToSQLException exception) { throw new RuntimeException(exception); } }
SimpleFeatureType featureType = getDataStore().getSchema(mv.getTargetTable()); PrimaryKey primaryKeys = getDataStore().getPrimaryKey(featureType); for (PrimaryKeyColumn primaryKey : primaryKeys.getColumns()) { encodeColumnName(finalSql, mv.getTargetTable(), primaryKey.getName()); finalSql.append(", "); for (String property : mv.getProperties()) { encodeColumnName(finalSql, mv.getTargetTable(), property); finalSql.append(", "); FilterToSQL cfToSql = createFilterToSQL(getDataStore().getSchema(mv.getTargetTable())); cfToSql.setFieldEncoder( field -> { StringBuffer fieldSql = new StringBuffer(); getDataStore().dialect.encodeTableName(mv.getTargetTable(), fieldSql); fieldSql.append("."); fieldSql.append(field); }); finalSql.append(" FROM "); getDataStore().encodeTableName(mv.getTargetTable(), finalSql, null); finalSql.append(" INNER JOIN (").append(sql).append(") AS "); getDataStore().dialect.encodeTableName("mv", finalSql); getDataStore().dialect.encodeTableName("mv", finalSql); finalSql.append("."); getDataStore().dialect.encodeColumnName(null, mv.getSourceColumn(), finalSql); finalSql.append(" = "); getDataStore().encodeTableName(mv.getTargetTable(), finalSql, null);
readFeature.getProperty(jdbcMultipleValue.getTargetColumn()).getValue(); List<MultiValueContainer> candidatesValues = candidates.get(targetColumnValue); if (candidatesValues == null) { candidates.put(targetColumnValue, candidatesValues); Object targetValue = jdbcMultipleValue.getTargetValue().evaluate(readFeature); candidatesValues.add(new MultiValueContainer(readFeature, targetValue)); sourceFeature.getProperty(jdbcMultipleValue.getSourceColumn()).getValue(); return candidates.get(sourceColumnValue);
public String[] getProperties() { if (properties == null) { List<String> propertiesList = new ArrayList<>(); // add the mapping attribute attributes String[] attributesProperties = DataUtilities.attributeNames(getTargetValue()); propertiesList.addAll(Arrays.asList(attributesProperties)); // add the target column propertiesList.add(targetColumn); // add the client properties for (Map.Entry<Name, Expression> entry : attributeMapping.getClientProperties().entrySet()) { String[] clientProperties = DataUtilities.attributeNames(entry.getValue()); propertiesList.addAll(Arrays.asList(clientProperties)); } // build the final properties array properties = propertiesList.toArray(new String[propertiesList.size()]); } return properties; }
private FilterToSQL createFilterToSQL(JdbcMultipleValue multipleValue) { SimpleFeatureType ft; try { ft = store.getSchema(multipleValue.getTargetTable()); } catch (IOException e) { throw new RuntimeException(e); } if (store.getSQLDialect() instanceof PreparedStatementSQLDialect) { PreparedFilterToSQL preparedFilterToSQL = store.createPreparedFilterToSQL(ft); preparedFilterToSQL.setPrepareEnabled(false); return preparedFilterToSQL; } return store.createFilterToSQL(ft); } }
private void encodeMultipleValueJoin( FeatureChainedAttributeDescriptor nestedAttribute, JDBCDataStore store, StringBuffer sql) { FeatureTypeMapping featureMapping = nestedAttribute.getFeatureTypeOwningAttribute(); AttributeMapping mapping = featureMapping.getAttributeMapping(nestedAttribute.getAttributePath()); if (mapping == null || !mapping.isMultiValued() || !(mapping.getMultipleValue() instanceof JdbcMultipleValue)) { return; } JdbcMultipleValue multipleValue = (JdbcMultipleValue) mapping.getMultipleValue(); sql.append(" LEFT JOIN "); String alias = String.valueOf(multipleValue.getId()); try { store.encodeAliasedTableName(multipleValue.getTargetTable(), sql, null, alias); } catch (SQLException e) { throw new RuntimeException(e); } sql.append(" ON "); store.dialect.encodeColumnName(nestedAttribute.getLastLink().getAlias(), sql); sql.append("."); store.dialect.encodeColumnName(multipleValue.getSourceColumn(), sql); sql.append(" = "); store.dialect.encodeTableName(alias, sql); sql.append("."); store.dialect.encodeColumnName(multipleValue.getTargetColumn(), sql); sql.append(" "); }