# Class AbstractFeatureSet

Object
AbstractResource
AbstractFeatureSet

All Implemented Interfaces:
  `DataSet, FeatureSet, Resource`

Direct Known Subclasses:
  `ConcatenatedFeatureSet, JoinFeatureSet, MemoryFeatureSet`

public abstract class AbstractFeatureSet extends AbstractResource implements FeatureSet
Default implementations of several methods for classes that want to implement the `FeatureSet` interface. Subclasses should override the following methods:

- `FeatureSet​.getType()` (mandatory)
- `FeatureSet​.features(boolean parallel)` (mandatory)
- `getFeatureCount()` (recommended)
- `AbstractResource​.getEnvelope()` (recommended)
- `createMetadata()` (optional)

## Thread safety

Default methods of this abstract class are thread-safe. Synchronization, when needed, uses `AbstractResource​.getSynchronizationLock()`.

Since:
  1.2

- ## Nested Class Summary

  ### Nested classes/interfaces inherited from interface Resource

  `Resource​.FileSet`

- ## Field Summary

  ### Fields inherited from class AbstractResource

  `listeners`

- ## Constructor Summary

  Constructors
  Modifier
  Constructor
  Description
  `protected`
  `AbstractFeatureSet(StoreListeners parentListeners, boolean hidden)`
  Creates a new resource which can send notifications to the given set of listeners.
  `protected`
  `AbstractFeatureSet(Resource parent)`
  Creates a new resource, potentially as a child of another resource.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `protected Metadata`
  `createMetadata()`
  Invoked in a synchronized block the first time that `getMetadata()` is invoked.
  `OptionalLong`
  `getFeatureCount()`
  Returns an estimation of the number of features in this set, or empty if unknown.
  `Optional<GenericName>`
  `getIdentifier()`
  Returns the feature type name as the identifier for this resource.
  `protected void`
  `prepareQueryOptimization(FeatureQuery query, Optimization optimizer)`
  Configures the optimization of a query to be applied on this `FeatureSet`.

  ### Methods inherited from class AbstractResource

  `addListener, clearCache, getEnvelope, getMetadata, getSynchronizationLock, removeListener`

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

  ### Methods inherited from interface DataSet

  `getEnvelope`

  ### Methods inherited from interface FeatureSet

  `features, getType`

  ### Methods inherited from interface Resource

  `addListener, getFileSet, getMetadata, removeListener`

- ## Constructor Details

  - ### AbstractFeatureSet

    protected AbstractFeatureSet(Resource parent)
    Creates a new resource, potentially as a child of another resource. The parent resource is typically, but not necessarily, an `Aggregate`.
    Parameters:
      `parent` - the parent resource, or `null` if none.
    Since:
      1.4

  - ### AbstractFeatureSet

    protected AbstractFeatureSet(StoreListeners parentListeners, boolean hidden)
    Creates a new resource which can send notifications to the given set of listeners. The `hidden` argument specifies whether the new resource should be invisible in the tree of resources. See the parent constructor for more information.
    Parameters:
      `parentListeners` - listeners of the parent resource, or `null` if none. This is usually the listeners of the `DataStore` that created this resource.
      `hidden` - `false` if this resource shall use its own `StoreListeners` with the specified parent, or `true` for using `parentListeners` directly.

- ## Method Details

  - ### getIdentifier

    public Optional<GenericName> getIdentifier() throws DataStoreException
    Returns the feature type name as the identifier for this resource. Subclasses should override if they can provide a more specific identifier.
    Specified by:
      `getIdentifier` in interface `Resource`
    Returns:
      the resource identifier inferred from feature type.
    Throws:
      `DataStoreException` - if an error occurred while fetching the identifier.
    See Also:
      - `DataStore​.getIdentifier()`

  - ### getFeatureCount

    public OptionalLong getFeatureCount()
    Returns an estimation of the number of features in this set, or empty if unknown. The default implementation returns an empty value.
    Returns:
      estimation of the number of features.

  - ### prepareQueryOptimization

    protected void prepareQueryOptimization(FeatureQuery query, Optimization optimizer) throws DataStoreException
    Configures the optimization of a query to be applied on this `FeatureSet`. This method is invoked indirectly by the default implementation of `subset(Query)`. The default implementation of this method does nothing.

    #### Recommendation

    Subclasses should override this method as below if they can guarantee that the feature type returned by `FeatureSet​.getType()` is final, i.e. that the result of the query will not contain any feature which (before projection) is an instance of some subtype:

        @Override
        protected void prepareQueryOptimization(FeatureQuery query, Optimization optimizer) throws DataStoreException {
            optimizer.setFinalFeatureType(getType());
        }

    Parameters:
      `query` - definition of feature and feature properties filtering applied at reading time.
      `optimizer` - the optimization to configure.
    Throws:
      `DataStoreException` - if an error occurred during the configuration of the optimizer.
    Since:
      1.6

  - ### createMetadata

    protected Metadata createMetadata() throws DataStoreException
    Invoked in a synchronized block the first time that `getMetadata()` is invoked. The default implementation populates metadata based on information provided by `getIdentifier()`, `getEnvelope()`, `getType()` and `getFeatureCount()`. Subclasses should override if they can provide more information. The default value can be completed by casting to `DefaultMetadata`.
    Overrides:
      `createMetadata` in class `AbstractResource`
    Returns:
      the newly created metadata, or `null` if unknown.
    Throws:
      `DataStoreException` - if an error occurred while reading metadata from this resource.