Package org.geotools.data.complex
Class DataAccessMappingFeatureIterator
- Object
-
- AbstractMappingFeatureIterator
-
- DataAccessMappingFeatureIterator
-
- All Implemented Interfaces:
Closeable
,AutoCloseable
,Iterator<Feature>
,IMappingFeatureIterator
,FeatureIterator<Feature>
- Direct Known Subclasses:
MappingAttributeIterator
,XmlMappingFeatureIterator
public class DataAccessMappingFeatureIterator extends AbstractMappingFeatureIterator
A Feature iterator that operates over the FeatureSource of a FeatureTypeMapping and produces Features of the output schema by applying the mapping rules to the Features of the source schema.This iterator acts like a one-to-one mapping, producing a Feature of the target type for each feature of the source type.
- Since:
- 2.4
- Author:
- Gabriel Roldan (Axios Engineering), Ben Caradoc-Davies (CSIRO Earth Science and Resource Engineering), Rini Angreani (CSIRO Earth Science and Resource Engineering), Russell Petty (GeoScience Victoria)
-
-
Field Summary
Fields Modifier and Type Field Description protected Feature
curSrcFeature
This is the feature that will be processed in next()protected List<Expression>
foreignIds
protected FeatureSource<? extends FeatureType,? extends Feature>
mappedSource
protected CoordinateReferenceSystem
reprojection
Reprojected CRS from the source simple features, or nullprotected FeatureCollection<? extends FeatureType,? extends Feature>
sourceFeatures
protected AttributeDescriptor
targetFeature
-
Fields inherited from class AbstractMappingFeatureIterator
attf, dataMaxFeatures, featureCounter, filterFac, ftf, GEOMETRY_FACTORY, includeMandatory, LOGGER, mapping, MULTI_VALUE_TYPE, namespaceAwareFilterFactory, namespaces, query, requestMaxFeatures, RESOLVE_TIMEOUT_POLL_INTERVAL, resolveDepth, resolveTimeOut, selectedMapping, selectedProperties, store, transaction, UNBOUNDED_MULTI_VALUE, XLINK_HREF_NAME, xpathAttributeBuilder
-
-
Constructor Summary
Constructors Constructor Description DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query)
DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised)
DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised, boolean hasPostFilter)
DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised, boolean hasPostFilter, Transaction transaction)
DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, Query unrolledQuery, boolean removeQueryLimitIfDenormalised)
DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, Query unrolledQuery, boolean removeQueryLimitIfDenormalised, Transaction transaction)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
checkForeignIdValues(List<Object> foreignIdValues)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.protected boolean
checkForeignIdValues(List<Object> foreignIdValues, Feature next)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.protected void
cleanEmptyElements(Feature target)
protected void
closeSourceFeatures()
protected Feature
computeNext()
protected String
extractIdForAttribute(Expression idExpression, Object sourceInstance)
Based on the set of xpath expression/id extracting expression, finds the ID for the attributeidExpression
from the source complex attribute.protected String
extractIdForFeature(Feature feature)
List<Object>
getForeignIdValues(Object source)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.List<Object>
getIdValues(Object source)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.FeatureSource<? extends FeatureType,? extends Feature>
getMappedSource()
For testing purposes.protected String
getNextFeatureId()
protected FeatureIterator<? extends Feature>
getSourceFeatureIterator()
protected List<Feature>
getSources(String id)
Get all source features of the provided id.protected Object
getValue(Expression expression, Object sourceFeature)
protected Object
getValues(boolean isMultiValued, Expression expression, Object sourceFeatureInput)
boolean
hasNext()
Does another Feature exist in this Iteration.protected void
initialiseSourceFeatures(FeatureTypeMapping mapping, Query query, CoordinateReferenceSystem targetCRS)
protected boolean
isByReference(Map<Name,Expression> clientPropsMappings, boolean isNested)
Checks if client property has xlink:ref in it, if the attribute is for chained features.protected boolean
isNextSourceFeatureNull()
boolean
isReprojectionCrsEqual(CoordinateReferenceSystem source, CoordinateReferenceSystem target)
protected boolean
isSourceFeatureIteratorNull()
boolean
isTransactionOwner()
Object
peekNextValue(Expression prop)
protected Object
peekValue(Object source, Expression prop)
protected Feature
populateFeatureData(String id)
protected Attribute
setAttributeValue(Attribute target, String id, Object source, AttributeMapping attMapping, Object values, XPathUtil.StepList inputXpath, List<PropertyName> selectedProperties)
Sets the values of grouping attributes.void
setForeignIds(List<Expression> ids)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.void
setListFilter(Filter filter)
protected List<Feature>
setNextFeature(String fId, List<Object> foreignIdValues)
protected void
setXlinkReference(Attribute target, Map<Name,Expression> clientPropsMappings, Object value, XPathUtil.StepList xpath, AttributeType targetNodeType)
Set xlink:href client property for multi-valued chained features.List<Feature>
skip()
void
skipNestedMapping(AttributeMapping attMapping, List<Feature> sources)
protected boolean
skipTopElement(Name topElement, AttributeMapping attMapping, AttributeType type)
protected boolean
sourceFeatureIteratorHasNext()
protected boolean
unprocessedFeatureExists()
-
Methods inherited from class AbstractMappingFeatureIterator
close, getClientProperties, getTransaction, getUnrolledQuery, isHasNextCalled, next, referenceToIdentifier, remove, setAttributeContent, setClientProperties, setGeometryUserData, setHasNextCalled
-
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface Iterator
forEachRemaining
-
-
-
-
Field Detail
-
reprojection
protected CoordinateReferenceSystem reprojection
Reprojected CRS from the source simple features, or null
-
curSrcFeature
protected Feature curSrcFeature
This is the feature that will be processed in next()
-
mappedSource
protected FeatureSource<? extends FeatureType,? extends Feature> mappedSource
-
sourceFeatures
protected FeatureCollection<? extends FeatureType,? extends Feature> sourceFeatures
-
foreignIds
protected List<Expression> foreignIds
-
targetFeature
protected AttributeDescriptor targetFeature
-
-
Constructor Detail
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised) throws IOException
- Throws:
IOException
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised, boolean hasPostFilter) throws IOException
- Throws:
IOException
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, boolean isFiltered, boolean removeQueryLimitIfDenormalised, boolean hasPostFilter, Transaction transaction) throws IOException
- Throws:
IOException
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query) throws IOException
- Throws:
IOException
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, Query unrolledQuery, boolean removeQueryLimitIfDenormalised) throws IOException
- Parameters:
mapping
- place holder for the target type, the surrogate FeatureSource and the mappings between them.query
- the query over the target feature type, that is to be unpacked to its equivalent over the surrogate feature type.- Throws:
IOException
-
DataAccessMappingFeatureIterator
public DataAccessMappingFeatureIterator(AppSchemaDataAccess store, FeatureTypeMapping mapping, Query query, Query unrolledQuery, boolean removeQueryLimitIfDenormalised, Transaction transaction) throws IOException
- Throws:
IOException
-
-
Method Detail
-
isTransactionOwner
public boolean isTransactionOwner()
-
hasNext
public boolean hasNext()
Description copied from interface:FeatureIterator
Does another Feature exist in this Iteration.Iterator defin: Returns true if the iteration has more elements. (In other words, returns true if next would return an element rather than throwing an exception.)
- Specified by:
hasNext
in interfaceFeatureIterator<Feature>
- Specified by:
hasNext
in interfaceIterator<Feature>
- Specified by:
hasNext
in classAbstractMappingFeatureIterator
- Returns:
- true if more Features exist, false otherwise.
-
getSourceFeatureIterator
protected FeatureIterator<? extends Feature> getSourceFeatureIterator()
- Specified by:
getSourceFeatureIterator
in classAbstractMappingFeatureIterator
-
isSourceFeatureIteratorNull
protected boolean isSourceFeatureIteratorNull()
- Specified by:
isSourceFeatureIteratorNull
in classAbstractMappingFeatureIterator
-
peekValue
protected Object peekValue(Object source, Expression prop)
-
peekNextValue
public Object peekNextValue(Expression prop)
-
setForeignIds
public void setForeignIds(List<Expression> ids)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.
-
getForeignIdValues
public List<Object> getForeignIdValues(Object source)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.
-
checkForeignIdValues
protected boolean checkForeignIdValues(List<Object> foreignIdValues, Feature next)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.
-
getIdValues
public List<Object> getIdValues(Object source)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.
-
checkForeignIdValues
public boolean checkForeignIdValues(List<Object> foreignIdValues)
Only used for Joining, to make sure that rows with different foreign id's aren't interpreted as one feature and merged.
-
initialiseSourceFeatures
protected void initialiseSourceFeatures(FeatureTypeMapping mapping, Query query, CoordinateReferenceSystem targetCRS) throws IOException
- Specified by:
initialiseSourceFeatures
in classAbstractMappingFeatureIterator
- Throws:
IOException
-
unprocessedFeatureExists
protected boolean unprocessedFeatureExists()
- Specified by:
unprocessedFeatureExists
in classAbstractMappingFeatureIterator
-
extractIdForAttribute
protected String extractIdForAttribute(Expression idExpression, Object sourceInstance)
Description copied from class:AbstractMappingFeatureIterator
Based on the set of xpath expression/id extracting expression, finds the ID for the attributeidExpression
from the source complex attribute.- Specified by:
extractIdForAttribute
in classAbstractMappingFeatureIterator
- Parameters:
idExpression
- the location path of the attribute to be created, for which to obtain the id by evaluating the correspondingorg.geotools.filter.Expression
fromsourceInstance
.sourceInstance
- a complex attribute which is the source of the mapping.- Returns:
- the ID to be applied to a new attribute instance addressed by
attributeXPath
, ornull
if there is no an id mapping for that attribute.
-
isNextSourceFeatureNull
protected boolean isNextSourceFeatureNull()
- Specified by:
isNextSourceFeatureNull
in classAbstractMappingFeatureIterator
-
sourceFeatureIteratorHasNext
protected boolean sourceFeatureIteratorHasNext()
- Specified by:
sourceFeatureIteratorHasNext
in classAbstractMappingFeatureIterator
-
getValues
protected Object getValues(boolean isMultiValued, Expression expression, Object sourceFeatureInput)
-
setAttributeValue
protected Attribute setAttributeValue(Attribute target, String id, Object source, AttributeMapping attMapping, Object values, XPathUtil.StepList inputXpath, List<PropertyName> selectedProperties) throws IOException
Sets the values of grouping attributes.- Returns:
- Feature. Target feature sets with simple attributes
- Throws:
IOException
-
setXlinkReference
protected void setXlinkReference(Attribute target, Map<Name,Expression> clientPropsMappings, Object value, XPathUtil.StepList xpath, AttributeType targetNodeType)
Set xlink:href client property for multi-valued chained features. This has to be specially handled because we don't want to encode the nested features attributes, since it's already an xLink. Also we need to eliminate duplicates.- Parameters:
target
- The target attributeclientPropsMappings
- Client properties mappingsvalue
- Nested featuresxpath
- Attribute xPath where the client properties are to be settargetNodeType
- Target node type
-
setNextFeature
protected List<Feature> setNextFeature(String fId, List<Object> foreignIdValues) throws IOException
- Throws:
IOException
-
skipNestedMapping
public void skipNestedMapping(AttributeMapping attMapping, List<Feature> sources) throws IOException
- Throws:
IOException
-
skip
public List<Feature> skip() throws IOException
- Throws:
IOException
-
computeNext
protected Feature computeNext() throws IOException
- Specified by:
computeNext
in classAbstractMappingFeatureIterator
- Throws:
IOException
-
getSources
protected List<Feature> getSources(String id) throws IOException
Get all source features of the provided id. This assumes the source features are grouped by id.- Parameters:
id
- The feature id- Returns:
- list of source features
- Throws:
IOException
-
getNextFeatureId
protected String getNextFeatureId()
-
cleanEmptyElements
protected void cleanEmptyElements(Feature target) throws DataSourceException
- Throws:
DataSourceException
-
skipTopElement
protected boolean skipTopElement(Name topElement, AttributeMapping attMapping, AttributeType type)
-
populateFeatureData
protected Feature populateFeatureData(String id) throws IOException
- Specified by:
populateFeatureData
in classAbstractMappingFeatureIterator
- Throws:
IOException
-
closeSourceFeatures
protected void closeSourceFeatures()
- Specified by:
closeSourceFeatures
in classAbstractMappingFeatureIterator
-
getValue
protected Object getValue(Expression expression, Object sourceFeature)
- Specified by:
getValue
in classAbstractMappingFeatureIterator
-
isByReference
protected boolean isByReference(Map<Name,Expression> clientPropsMappings, boolean isNested)
Checks if client property has xlink:ref in it, if the attribute is for chained features.- Parameters:
clientPropsMappings
- the client properties mappingsisNested
- true if we're dealing with chained/nested features
-
isReprojectionCrsEqual
public boolean isReprojectionCrsEqual(CoordinateReferenceSystem source, CoordinateReferenceSystem target)
-
setListFilter
public void setListFilter(Filter filter)
-
getMappedSource
public FeatureSource<? extends FeatureType,? extends Feature> getMappedSource()
For testing purposes.- Returns:
- the feature source providing input features to be mapped to target features
-
-