Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2384006

Browse files
committedAug 13, 2024·
#9885 (#32) - consider all geometry properties if propName is missing
1 parent aca75ad commit 2384006

File tree

13 files changed

+155
-121
lines changed

13 files changed

+155
-121
lines changed
 

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-commons/src/main/java/org/deegree/sqldialect/filter/AbstractWhereBuilder.java

+51-17
Original file line numberDiff line numberDiff line change
@@ -678,8 +678,24 @@ protected SQLOperation toProtoSQL(LogicalOperator op) throws UnmappableException
678678
* @throws FilterEvaluationException if the filter contains invalid
679679
* {@link ValueReference}s
680680
*/
681-
protected abstract SQLOperation toProtoSQL(SpatialOperator op)
682-
throws UnmappableException, FilterEvaluationException;
681+
protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
682+
List<SQLExpression> propNameExprs = toProtoSQLSpatial(op.getPropName());
683+
checkIfExpressionsAreSpatial(propNameExprs, op.getPropName());
684+
685+
SQLOperationBuilder builder = new SQLOperationBuilder(BOOLEAN);
686+
boolean isFirst = true;
687+
for (SQLExpression propNameExpr : propNameExprs) {
688+
if (!isFirst) {
689+
builder.add(" OR ");
690+
}
691+
toProtoSql(op, propNameExpr, builder);
692+
isFirst = false;
693+
}
694+
return builder.toOperation();
695+
}
696+
697+
protected abstract void toProtoSql(SpatialOperator op, SQLExpression propNameExpr, SQLOperationBuilder builder)
698+
throws FilterEvaluationException, UnmappableException;
683699

684700
/**
685701
* Translates the given {@link TemporalOperator} into an {@link SQLOperation}.
@@ -916,22 +932,25 @@ protected SQLExpression toProtoSQL(ValueReference propName) throws UnmappableExc
916932
* @throws FilterEvaluationException if the filter contains invalid
917933
* {@link ValueReference}s
918934
*/
919-
protected SQLExpression toProtoSQLSpatial(ValueReference propName)
935+
protected List<SQLExpression> toProtoSQLSpatial(ValueReference propName)
920936
throws FilterEvaluationException, UnmappableException {
921-
SQLExpression sql = null;
922-
PropertyNameMapping propMapping = mapper.getSpatialMapping(propName, aliasManager);
923-
if (propMapping != null) {
924-
propNameMappingList.add(propMapping);
925-
if (propMapping instanceof ConstantPropertyNameMapping) {
926-
// TODO get rid of ConstantPropertyNameMapping
927-
PrimitiveType pt = new PrimitiveType(STRING);
928-
PrimitiveValue value = new PrimitiveValue("" + ((ConstantPropertyNameMapping) propMapping).getValue(),
929-
pt);
930-
PrimitiveParticleConverter converter = new DefaultPrimitiveConverter(pt, null, false);
931-
sql = new SQLArgument(value, converter);
932-
}
933-
else {
934-
sql = new SQLColumn(propMapping.getTableAlias(), propMapping.getColumn(), propMapping.getConverter());
937+
List<SQLExpression> sql = new ArrayList<>();
938+
List<PropertyNameMapping> propMappings = mapper.getSpatialMappings(propName, aliasManager);
939+
if (!propMappings.isEmpty()) {
940+
for (PropertyNameMapping propMapping : propMappings) {
941+
propNameMappingList.add(propMapping);
942+
if (propMapping instanceof ConstantPropertyNameMapping) {
943+
// TODO get rid of ConstantPropertyNameMapping
944+
PrimitiveType pt = new PrimitiveType(STRING);
945+
PrimitiveValue value = new PrimitiveValue(
946+
"" + ((ConstantPropertyNameMapping) propMapping).getValue(), pt);
947+
PrimitiveParticleConverter converter = new DefaultPrimitiveConverter(pt, null, false);
948+
sql.add(new SQLArgument(value, converter));
949+
}
950+
else {
951+
sql.add(new SQLColumn(propMapping.getTableAlias(), propMapping.getColumn(),
952+
propMapping.getConverter()));
953+
}
935954
}
936955
}
937956
else {
@@ -1015,4 +1034,19 @@ protected String getStringValueFromFunction(Expression pattern)
10151034
return ((PrimitiveValue) value).getAsText();
10161035
}
10171036

1037+
private void checkIfExpressionsAreSpatial(List<SQLExpression> sqlExpressions, ValueReference propName)
1038+
throws FilterEvaluationException {
1039+
for (SQLExpression sqlExpression : sqlExpressions)
1040+
checkIfExpressionIsSpatial(sqlExpression, propName);
1041+
}
1042+
1043+
protected void checkIfExpressionIsSpatial(SQLExpression sqlExpression, ValueReference propName)
1044+
throws FilterEvaluationException {
1045+
if (!sqlExpression.isSpatial()) {
1046+
String msg = "Cannot evaluate spatial operator on database. Targeted property name '" + propName
1047+
+ "' does not denote a spatial column.";
1048+
throw new FilterEvaluationException(msg);
1049+
}
1050+
}
1051+
10181052
}

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-commons/src/main/java/org/deegree/sqldialect/filter/PropertyNameMapper.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import org.deegree.filter.FilterEvaluationException;
3838
import org.deegree.filter.expression.ValueReference;
3939

40+
import java.util.List;
41+
4042
/**
4143
* Implementations provide {@link ValueReference} to table/column mappings for
4244
* {@link AbstractWhereBuilder} implementations.
@@ -56,10 +58,10 @@ public interface PropertyNameMapper {
5658
* invalid
5759
* @throws UnmappableException
5860
*/
59-
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager)
61+
PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager)
6062
throws FilterEvaluationException, UnmappableException;
6163

62-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
64+
List<PropertyNameMapping> getSpatialMappings(ValueReference propName, TableAliasManager aliasManager)
6365
throws FilterEvaluationException, UnmappableException;
6466

6567
}

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-mssql/src/main/java/org/deegree/sqldialect/mssql/MSSQLWhereBuilder.java

+4-15
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,6 @@
3434
----------------------------------------------------------------------------*/
3535
package org.deegree.sqldialect.mssql;
3636

37-
import static java.sql.Types.BOOLEAN;
38-
import static org.deegree.commons.tom.primitive.BaseType.DECIMAL;
39-
4037
import org.deegree.commons.tom.primitive.PrimitiveType;
4138
import org.deegree.commons.tom.primitive.PrimitiveValue;
4239
import org.deegree.commons.tom.sql.DefaultPrimitiveConverter;
@@ -74,6 +71,9 @@
7471

7572
import java.util.List;
7673

74+
import static java.sql.Types.BOOLEAN;
75+
import static org.deegree.commons.tom.primitive.BaseType.DECIMAL;
76+
7777
/**
7878
* {@link AbstractWhereBuilder} implementation for Microsoft SQL Server databases.
7979
*
@@ -162,17 +162,7 @@ private String replaceAdditionalMsSqlServerSpecialChars(String sqlEncoded) {
162162
}
163163

164164
@Override
165-
protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
166-
167-
SQLOperationBuilder builder = new SQLOperationBuilder(BOOLEAN);
168-
169-
SQLExpression propNameExpr = toProtoSQLSpatial(op.getPropName());
170-
if (!propNameExpr.isSpatial()) {
171-
String msg = "Cannot evaluate spatial operator on database. Targeted property name '" + op.getPropName()
172-
+ "' does not denote a spatial column.";
173-
throw new FilterEvaluationException(msg);
174-
}
175-
165+
protected void toProtoSql(SpatialOperator op, SQLExpression propNameExpr, SQLOperationBuilder builder) {
176166
ICRS storageCRS = propNameExpr.getCRS();
177167
int srid = propNameExpr.getSRID() != null ? Integer.parseInt(propNameExpr.getSRID()) : 0;
178168

@@ -269,7 +259,6 @@ protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException
269259
break;
270260
}
271261
}
272-
return builder.toOperation();
273262
}
274263

275264
private SQLExpression toProtoSQL(Geometry geom, ICRS targetCRS, int srid) {

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-mssql/src/test/java/org/deegree/sqldialect/mssql/MSSQLWhereBuilderTest.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
import org.junit.Before;
5555
import org.junit.Test;
5656

57+
import java.util.Collections;
58+
import java.util.List;
59+
5760
/**
5861
* Tests for {@link MSSQLWhereBuilder}.
5962
*
@@ -70,14 +73,13 @@ public void setup() throws FilterEvaluationException, UnmappableException {
7073
PropertyNameMapper mapper = new PropertyNameMapper() {
7174

7275
@Override
73-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
74-
throws FilterEvaluationException, UnmappableException {
75-
return new PropertyNameMapping(null, null, propName.getAsText(), "table");
76+
public List<PropertyNameMapping> getSpatialMappings(ValueReference propName,
77+
TableAliasManager aliasManager) {
78+
return Collections.singletonList(new PropertyNameMapping(null, null, propName.getAsText(), "table"));
7679
}
7780

7881
@Override
79-
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager)
80-
throws FilterEvaluationException, UnmappableException {
82+
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager) {
8183
return new PropertyNameMapping(null, null, propName.getAsText(), "table");
8284
}
8385
};

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-oracle/src/main/java/org/deegree/sqldialect/oracle/OracleWhereBuilder.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,7 @@ class OracleWhereBuilder extends AbstractWhereBuilder {
129129
}
130130

131131
@Override
132-
protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
133-
134-
SQLOperationBuilder builder = new SQLOperationBuilder(BOOLEAN);
135-
SQLExpression propNameExpr = toProtoSQLSpatial(op.getPropName());
136-
132+
protected void toProtoSql(SpatialOperator op, SQLExpression propNameExpr, SQLOperationBuilder builder) {
137133
switch (op.getSubType()) {
138134
case BBOX:
139135
BBOX bbox = (BBOX) op;
@@ -178,8 +174,6 @@ protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException
178174
appendDWithinOperation(builder, propNameExpr, ((Beyond) op).getGeometry(), ((Beyond) op).getDistance());
179175
break;
180176
}
181-
182-
return builder.toOperation();
183177
}
184178

185179
/**

‎deegree-core/deegree-core-sqldialect/deegree-sqldialect-postgis/src/main/java/org/deegree/sqldialect/postgis/PostGISWhereBuilder.java

+10-18
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@
8282
import org.deegree.time.position.TimePosition;
8383
import org.deegree.time.primitive.GenericTimeInstant;
8484
import org.deegree.time.primitive.GenericTimePeriod;
85+
import org.slf4j.Logger;
86+
import org.slf4j.LoggerFactory;
8587

8688
/**
8789
* {@link AbstractWhereBuilder} implementation for PostGIS databases.
@@ -90,6 +92,8 @@
9092
*/
9193
public class PostGISWhereBuilder extends AbstractWhereBuilder {
9294

95+
private static final Logger LOG = LoggerFactory.getLogger(PostGISWhereBuilder.class);
96+
9397
private final boolean useLegacyPredicates;
9498

9599
/**
@@ -187,13 +191,8 @@ private SQLOperation getOperationFromBuilder(PropertyIsLike op, SQLExpression pr
187191
}
188192

189193
@Override
190-
protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
191-
192-
SQLOperationBuilder builder = new SQLOperationBuilder(BOOLEAN);
193-
194-
SQLExpression propNameExpr = toProtoSQLSpatial(op.getPropName());
195-
checkIfExpressionIsSpatial(propNameExpr, op.getPropName());
196-
194+
protected void toProtoSql(SpatialOperator op, SQLExpression propNameExpr, SQLOperationBuilder builder)
195+
throws FilterEvaluationException, UnmappableException {
197196
ICRS storageCRS = propNameExpr.getCRS();
198197
int srid = propNameExpr.getSRID() != null ? Integer.parseInt(propNameExpr.getSRID()) : -1;
199198

@@ -376,7 +375,6 @@ protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException
376375
break;
377376
}
378377
}
379-
return builder.toOperation();
380378
}
381379

382380
protected SQLOperation toProtoSQL(TemporalOperator op) throws UnmappableException, FilterEvaluationException {
@@ -495,7 +493,10 @@ private SQLExpression toProtoSQL(Geometry geom, ICRS targetCRS, int srid) throws
495493
private SQLExpression toProtoSqlSecondParameter(SpatialOperator spatialOperator, ICRS storageCRS, int srid)
496494
throws FilterEvaluationException, UnmappableException {
497495
if (spatialOperator.getValueReference() != null) {
498-
SQLExpression sqlExpression = toProtoSQLSpatial(spatialOperator.getValueReference());
496+
List<SQLExpression> sqlExpressions = toProtoSQLSpatial(spatialOperator.getValueReference());
497+
if (sqlExpressions.size() > 1)
498+
LOG.warn("Multiple spatial geometry mappings as second parameter are currently not supported.");
499+
SQLExpression sqlExpression = sqlExpressions.get(0);
499500
checkIfExpressionIsSpatial(sqlExpression, spatialOperator.getValueReference());
500501
return sqlExpression;
501502
}
@@ -575,13 +576,4 @@ private boolean isTimeInstant(Expression parameter2) {
575576
return parameter2 instanceof Literal && ((Literal<?>) parameter2).getValue() instanceof GenericTimeInstant;
576577
}
577578

578-
private void checkIfExpressionIsSpatial(SQLExpression sqlExpression, ValueReference propName)
579-
throws FilterEvaluationException {
580-
if (!sqlExpression.isSpatial()) {
581-
String msg = "Cannot evaluate spatial operator on database. Targeted property name '" + propName
582-
+ "' does not denote a spatial column.";
583-
throw new FilterEvaluationException(msg);
584-
}
585-
}
586-
587579
}

‎deegree-datastores/deegree-featurestores/deegree-featurestore-shape/src/main/java/org/deegree/feature/persistence/shape/H2WhereBuilder.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.deegree.sqldialect.filter.expression.SQLColumn;
5656
import org.deegree.sqldialect.filter.expression.SQLExpression;
5757
import org.deegree.sqldialect.filter.expression.SQLOperation;
58+
import org.deegree.sqldialect.filter.expression.SQLOperationBuilder;
5859

5960
/**
6061
* @author <a href="mailto:schmitz@lat-lon.de">Andreas Schmitz</a>
@@ -80,7 +81,8 @@ public H2WhereBuilder(SQLDialect dialect, OperatorFilter filter, SortProperty[]
8081
}
8182

8283
@Override
83-
protected SQLOperation toProtoSQL(SpatialOperator op) throws UnmappableException, FilterEvaluationException {
84+
protected void toProtoSql(SpatialOperator op, SQLExpression propNameExpr, SQLOperationBuilder builder)
85+
throws UnmappableException {
8486
throw new UnmappableException("Spatial operators are currently not mappable in h2.");
8587
}
8688

‎deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLFeatureStore.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.sql.Statement;
4949
import java.util.ArrayList;
5050
import java.util.Collection;
51+
import java.util.Collections;
5152
import java.util.Date;
5253
import java.util.HashMap;
5354
import java.util.Iterator;
@@ -1680,8 +1681,7 @@ private AbstractWhereBuilder getWhereBuilderBlob(OperatorFilter filter, Connecti
16801681
final String srid = detectConfiguredSrid();
16811682
PropertyNameMapper mapper = new PropertyNameMapper() {
16821683
@Override
1683-
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager)
1684-
throws FilterEvaluationException, UnmappableException {
1684+
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager) {
16851685
GeometryStorageParams geometryParams = new GeometryStorageParams(blobMapping.getCRS(), srid,
16861686
CoordinateDimension.DIM_2);
16871687
GeometryMapping bboxMapping = new GeometryMapping(null, false, new DBField(blobMapping.getBBoxColumn()),
@@ -1691,9 +1691,9 @@ public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager
16911691
}
16921692

16931693
@Override
1694-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
1695-
throws FilterEvaluationException, UnmappableException {
1696-
return getMapping(propName, aliasManager);
1694+
public List<PropertyNameMapping> getSpatialMappings(ValueReference propName,
1695+
TableAliasManager aliasManager) {
1696+
return Collections.singletonList(getMapping(propName, aliasManager));
16971697
}
16981698
};
16991699
return dialect.getWhereBuilder(mapper, filter, null, null, allowInMemoryFiltering);

‎deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/SQLPropertyNameMapper.java

+32-16
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,6 @@
3434
----------------------------------------------------------------------------*/
3535
package org.deegree.feature.persistence.sql;
3636

37-
import java.util.ArrayList;
38-
import java.util.Collection;
39-
import java.util.List;
40-
41-
import javax.xml.namespace.QName;
42-
4337
import org.deegree.commons.utils.QNameUtils;
4438
import org.deegree.feature.persistence.sql.xpath.MappableNameStep;
4539
import org.deegree.feature.persistence.sql.xpath.MappableStep;
@@ -50,6 +44,13 @@
5044
import org.deegree.sqldialect.filter.PropertyNameMapping;
5145
import org.deegree.sqldialect.filter.TableAliasManager;
5246
import org.deegree.sqldialect.filter.UnmappableException;
47+
import org.slf4j.Logger;
48+
import org.slf4j.LoggerFactory;
49+
50+
import javax.xml.namespace.QName;
51+
import java.util.ArrayList;
52+
import java.util.Collection;
53+
import java.util.List;
5354

5455
/**
5556
* {@link PropertyNameMapper} for the {@link SQLFeatureStore}.
@@ -58,6 +59,8 @@
5859
*/
5960
public class SQLPropertyNameMapper implements PropertyNameMapper {
6061

62+
private static final Logger LOG = LoggerFactory.getLogger(SQLPropertyNameMapper.class);
63+
6164
private final SQLFeatureStore fs;
6265

6366
private final FeatureTypeMapping ftMapping;
@@ -103,23 +106,36 @@ else if (ftMapping == null && (ftMappings != null && ftMappings.size() > 1)) {
103106
@Override
104107
public PropertyNameMapping getMapping(ValueReference propName, TableAliasManager aliasManager)
105108
throws FilterEvaluationException, UnmappableException {
106-
if (ftMapping != null || propName == null || propName.getAsText().isEmpty())
107-
return new MappedXPath(fs, ftMapping, propName, aliasManager, false, handleStrict).getPropertyNameMapping();
109+
if (ftMapping != null || propName == null || propName.getAsText().isEmpty()) {
110+
List<PropertyNameMapping> propertyNameMappings = new MappedXPath(fs, ftMapping, propName, aliasManager,
111+
false, handleStrict)
112+
.getPropertyNameMappings();
113+
if (propertyNameMappings.isEmpty())
114+
return null;
115+
else if (propertyNameMappings.size() > 1)
116+
LOG.warn("Multiple non-spatial mappings are currently not supported!");
117+
return propertyNameMappings.get(0);
118+
}
108119
FeatureTypeMapping correspondingFtMapping = findCorrespondingMapping(propName);
109-
return new MappedXPath(fs, correspondingFtMapping, propName, aliasManager, false, handleStrict)
110-
.getPropertyNameMapping();
120+
List<PropertyNameMapping> propertyNameMappings = new MappedXPath(fs, correspondingFtMapping, propName,
121+
aliasManager, false, handleStrict)
122+
.getPropertyNameMappings();
123+
if (propertyNameMappings.isEmpty())
124+
return null;
125+
else if (propertyNameMappings.size() > 1)
126+
LOG.warn("Multiple non-spatial mappings are currently not supported!");
127+
return propertyNameMappings.get(0);
111128

112129
}
113130

114131
@Override
115-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
116-
throws FilterEvaluationException, UnmappableException {
117-
132+
public List<PropertyNameMapping> getSpatialMappings(ValueReference propName, TableAliasManager aliasManager)
133+
throws UnmappableException {
118134
if (ftMapping != null || propName == null || propName.getAsText().isEmpty())
119-
return new MappedXPath(fs, ftMapping, propName, aliasManager, true, handleStrict).getPropertyNameMapping();
120-
FeatureTypeMapping correspondingFtMapping = findCorrespondingMapping(propName);
135+
return new MappedXPath(fs, ftMapping, propName, aliasManager, true, handleStrict).getPropertyNameMappings();
136+
FeatureTypeMapping correspondingFtMapping = ftMapping != null ? ftMapping : findCorrespondingMapping(propName);
121137
return new MappedXPath(fs, correspondingFtMapping, propName, aliasManager, true, handleStrict)
122-
.getPropertyNameMapping();
138+
.getPropertyNameMappings();
123139
}
124140

125141
private FeatureTypeMapping findCorrespondingMapping(ValueReference propName) throws UnmappableException {

‎deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/main/java/org/deegree/feature/persistence/sql/xpath/MappedXPath.java

+15-23
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public class MappedXPath {
9494

9595
private String currentTableAlias;
9696

97-
private PropertyNameMapping propMapping;
97+
private List<PropertyNameMapping> propMappings = new ArrayList<>();
9898

9999
/**
100100
* @param fs
@@ -141,8 +141,8 @@ public MappedXPath(SQLFeatureStore fs, FeatureTypeMapping ftMapping, ValueRefere
141141
map(ftMapping.getMappings(), steps);
142142
}
143143

144-
public PropertyNameMapping getPropertyNameMapping() {
145-
return propMapping;
144+
public List<PropertyNameMapping> getPropertyNameMappings() {
145+
return propMappings;
146146
}
147147

148148
private void map(Collection<Mapping> mappedParticles, List<MappableStep> steps) throws UnmappableException {
@@ -202,13 +202,14 @@ else if (mapping instanceof FeatureMapping) {
202202
throw new InvalidParameterValueException(msg);
203203
}
204204
// determine path to nearest geometry mapping
205-
List<Mapping> additionalSteps = new ArrayList<Mapping>();
206-
if (determineNearestGeometryMapping(mappedParticles, additionalSteps)) {
205+
List<GeometryMapping> additionalSteps = new ArrayList<>();
206+
determineNearestGeometryMappings(mappedParticles, additionalSteps);
207+
if (!additionalSteps.isEmpty()) {
207208
matchFound = true;
208-
for (int i = 0; i < additionalSteps.size() - 1; i++) {
209-
followJoins(additionalSteps.get(i).getJoinedTable());
209+
for (GeometryMapping geomStep : additionalSteps) {
210+
followJoins(geomStep.getJoinedTable());
211+
map(geomStep, steps);
210212
}
211-
map((GeometryMapping) additionalSteps.get(additionalSteps.size() - 1), steps);
212213
}
213214
}
214215

@@ -224,24 +225,15 @@ else if (mapping instanceof FeatureMapping) {
224225
}
225226
}
226227

227-
private boolean determineNearestGeometryMapping(Collection<Mapping> mappedParticles, List<Mapping> steps) {
228-
boolean found = false;
228+
private void determineNearestGeometryMappings(Collection<Mapping> mappedParticles, List<GeometryMapping> steps) {
229229
for (Mapping mapping : mappedParticles) {
230230
if (mapping instanceof GeometryMapping) {
231-
steps.add(mapping);
232-
found = true;
233-
break;
231+
steps.add((GeometryMapping) mapping);
234232
}
235233
else if (mapping instanceof CompoundMapping) {
236-
steps.add(mapping);
237-
found = determineNearestGeometryMapping(((CompoundMapping) mapping).getParticles(), steps);
238-
if (found) {
239-
break;
240-
}
241-
steps.remove(steps.size() - 1);
234+
determineNearestGeometryMappings(((CompoundMapping) mapping).getParticles(), steps);
242235
}
243236
}
244-
return found;
245237
}
246238

247239
private void map(PrimitiveMapping mapping, List<MappableStep> remaining) throws UnmappableException {
@@ -253,10 +245,10 @@ private void map(PrimitiveMapping mapping, List<MappableStep> remaining) throws
253245
}
254246
if (!(me instanceof DBField)) {
255247
final String qualifiedExpr = me.toString().replace("$0", currentTableAlias);
256-
propMapping = new PropertyNameMapping(converter, joins, qualifiedExpr, null);
248+
propMappings.add(new PropertyNameMapping(converter, joins, qualifiedExpr, null));
257249
return;
258250
}
259-
propMapping = new PropertyNameMapping(converter, joins, ((DBField) me).getColumn(), currentTableAlias);
251+
propMappings.add(new PropertyNameMapping(converter, joins, ((DBField) me).getColumn(), currentTableAlias));
260252
}
261253

262254
private void map(GeometryMapping mapping, List<MappableStep> remaining) throws UnmappableException {
@@ -270,7 +262,7 @@ private void map(GeometryMapping mapping, List<MappableStep> remaining) throws U
270262
if (fs != null) {
271263
converter = fs.getConverter(geomMapping);
272264
}
273-
propMapping = new PropertyNameMapping(converter, joins, ((DBField) me).getColumn(), currentTableAlias);
265+
propMappings.add(new PropertyNameMapping(converter, joins, ((DBField) me).getColumn(), currentTableAlias));
274266
}
275267

276268
private void map(FeatureMapping mapping, List<MappableStep> remaining) throws UnmappableException {

‎deegree-datastores/deegree-featurestores/deegree-featurestore-sql/src/test/java/org/deegree/feature/persistence/sql/SQLPropertyNameMapperTest.java

+17-7
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
----------------------------------------------------------------------------*/
3535
package org.deegree.feature.persistence.sql;
3636

37-
import static org.hamcrest.CoreMatchers.notNullValue;
37+
import static org.hamcrest.CoreMatchers.is;
3838
import static org.junit.Assert.assertThat;
3939
import static org.mockito.Mockito.mock;
4040
import static org.mockito.Mockito.when;
@@ -85,9 +85,9 @@ public void testGetSpatialMapping() throws Exception {
8585
ValueReference propName = new ValueReference("app:ftType2/app:geometry", nsContext());
8686
List<FeatureTypeMapping> ftMapping = createFeatureTypeMappings(propName);
8787
SQLPropertyNameMapper mapper = new SQLPropertyNameMapper(mockFeatureStore(), ftMapping, false);
88-
PropertyNameMapping spatialMapping = mapper.getSpatialMapping(propName, mockAliasManager());
88+
List<PropertyNameMapping> spatialMappings = mapper.getSpatialMappings(propName, mockAliasManager());
8989

90-
assertThat(spatialMapping, notNullValue());
90+
assertThat(spatialMappings.size(), is(1));
9191
}
9292

9393
@Test
@@ -96,19 +96,29 @@ public void testGetSpatialMapping_withMissingNamespaceBinding() throws Exception
9696
CommonNamespaces.getNamespaceContext());
9797
List<FeatureTypeMapping> ftMapping = createFeatureTypeMappings(propName);
9898
SQLPropertyNameMapper mapper = new SQLPropertyNameMapper(mockFeatureStore(), ftMapping, false);
99-
PropertyNameMapping spatialMapping = mapper.getSpatialMapping(propName, mockAliasManager());
99+
List<PropertyNameMapping> spatialMappings = mapper.getSpatialMappings(propName, mockAliasManager());
100100

101-
assertThat(spatialMapping, notNullValue());
101+
assertThat(spatialMappings.size(), is(1));
102102
}
103103

104104
@Test
105105
public void testGetSpatialMapping_withMissingNamespaceBindingAndPrefix() throws Exception {
106106
ValueReference propName = new ValueReference("ftType2/geometry", CommonNamespaces.getNamespaceContext());
107107
List<FeatureTypeMapping> ftMapping = createFeatureTypeMappings(propName);
108108
SQLPropertyNameMapper mapper = new SQLPropertyNameMapper(mockFeatureStore(), ftMapping, false);
109-
PropertyNameMapping spatialMapping = mapper.getSpatialMapping(propName, mockAliasManager());
109+
List<PropertyNameMapping> spatialMappings = mapper.getSpatialMappings(propName, mockAliasManager());
110110

111-
assertThat(spatialMapping, notNullValue());
111+
assertThat(spatialMappings.size(), is(1));
112+
}
113+
114+
@Test
115+
public void testGetSpatialMapping_withNullPropName() throws Exception {
116+
ValueReference propName = new ValueReference("app:ftType2/app:geometry", nsContext());
117+
FeatureTypeMapping ftMapping = mockFeatureTypeMapping("ftType1", "http://www.deegree.org/app", propName);
118+
SQLPropertyNameMapper mapper = new SQLPropertyNameMapper(mockFeatureStore(), ftMapping, false);
119+
List<PropertyNameMapping> spatialMappings = mapper.getSpatialMappings(null, mockAliasManager());
120+
121+
assertThat(spatialMappings.size(), is(1));
112122
}
113123

114124
private List<FeatureTypeMapping> createFeatureTypeMappings(ValueReference valueReference) {

‎deegree-datastores/deegree-mdstores/deegree-mdstore-ebrim-eo/src/main/java/org/deegree/metadata/persistence/ebrim/eo/mapping/EOPropertyNameMapper.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -593,9 +593,9 @@ private boolean isElementStep(NameStep step, QName elName) {
593593
}
594594

595595
@Override
596-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
596+
public List<PropertyNameMapping> getSpatialMappings(ValueReference propName, TableAliasManager aliasManager)
597597
throws FilterEvaluationException, UnmappableException {
598-
return getMapping(propName, aliasManager);
598+
return Collections.singletonList(getMapping(propName, aliasManager));
599599
}
600600

601601
}

‎deegree-datastores/deegree-mdstores/deegree-mdstore-iso/src/main/java/org/deegree/metadata/iso/persistence/ISOPropertyNameMapper.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import static org.slf4j.LoggerFactory.getLogger;
4949

5050
import java.util.ArrayList;
51+
import java.util.Collections;
5152
import java.util.HashMap;
5253
import java.util.List;
5354
import java.util.Map;
@@ -396,9 +397,9 @@ public Map<QName, Triple<Pair<String, String>, Boolean, BaseType>> getPropToTabl
396397
}
397398

398399
@Override
399-
public PropertyNameMapping getSpatialMapping(ValueReference propName, TableAliasManager aliasManager)
400-
throws FilterEvaluationException, UnmappableException {
401-
return getMapping(propName, aliasManager);
400+
public List<PropertyNameMapping> getSpatialMappings(ValueReference propName, TableAliasManager aliasManager)
401+
throws FilterEvaluationException {
402+
return Collections.singletonList(getMapping(propName, aliasManager));
402403
}
403404

404405
}

0 commit comments

Comments
 (0)
Please sign in to comment.