Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Root concat #1270

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,11 @@ public class FeaturesFormatCsv extends FeatureFormatExtension implements Conform
.parameter("json")
.build();

private final FeaturesCoreProviders providers;
private final FeatureSchemaCache schemaCache;

@Inject
public FeaturesFormatCsv(FeaturesCoreProviders providers, ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
this.providers = providers;
super(extensionRegistry, providers);
this.schemaCache = new SchemaCacheSfFlat();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,13 @@ public class FeaturesFormatFlatgeobuf extends FeatureFormatExtension implements
.parameter("fgb")
.build();

private final FeaturesCoreProviders providers;
private final CrsInfo crsInfo;
private final FeatureSchemaCache schemaCache;

@Inject
public FeaturesFormatFlatgeobuf(
FeaturesCoreProviders providers, CrsInfo crsInfo, ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
this.providers = providers;
super(extensionRegistry, providers);
this.crsInfo = crsInfo;
this.schemaCache = new SchemaCacheSfFlat();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ public class FeaturesFormatGltfBinary extends FeatureFormatExtension {
public static final Schema<?> SCHEMA = new BinarySchema();
public static final String SCHEMA_REF = "#/components/schemas/glTF";

private final FeaturesCoreProviders providers;
private final Values<Codelist> codelistStore;
private final FeaturesCoreValidation featuresCoreValidator;
private final CrsTransformerFactory crsTransformerFactory;
Expand All @@ -101,8 +100,7 @@ public FeaturesFormatGltfBinary(
ServicesContext servicesContext,
Metadata3dSchemaCache schemaCache,
ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
this.providers = providers;
super(extensionRegistry, providers);
this.codelistStore = valueStore.forType(Codelist.class);
this.featuresCoreValidator = featuresCoreValidator;
this.crsTransformerFactory = crsTransformerFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import com.github.azahnen.dagger.annotations.AutoBind;
import de.ii.ogcapi.features.core.domain.FeatureTransformationContext;
import de.ii.ogcapi.features.core.domain.FeaturesCoreProviders;
import de.ii.ogcapi.features.core.domain.SchemaGeneratorCollectionOpenApi;
import de.ii.ogcapi.features.core.domain.SchemaGeneratorOpenApi;
import de.ii.ogcapi.features.geojson.domain.GeoJsonWriter;
Expand Down Expand Up @@ -49,8 +50,9 @@ public FeaturesFormatJsonFg(
SchemaGeneratorOpenApi schemaGeneratorFeature,
SchemaGeneratorCollectionOpenApi schemaGeneratorFeatureCollection,
GeoJsonWriterRegistry geoJsonWriterRegistry,
ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
ExtensionRegistry extensionRegistry,
FeaturesCoreProviders providers) {
super(extensionRegistry, providers);
this.schemaGeneratorFeature = schemaGeneratorFeature;
this.schemaGeneratorFeatureCollection = schemaGeneratorFeatureCollection;
this.geoJsonWriterRegistry = geoJsonWriterRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.github.azahnen.dagger.annotations.AutoBind;
import com.google.common.collect.ImmutableMap;
import de.ii.ogcapi.features.core.domain.FeatureTransformationContext;
import de.ii.ogcapi.features.core.domain.FeaturesCoreProviders;
import de.ii.ogcapi.features.core.domain.SchemaGeneratorCollectionOpenApi;
import de.ii.ogcapi.features.core.domain.SchemaGeneratorOpenApi;
import de.ii.ogcapi.features.geojson.domain.GeoJsonWriter;
Expand Down Expand Up @@ -49,8 +50,9 @@ public FeaturesFormatJsonFgCompatibility(
SchemaGeneratorOpenApi schemaGeneratorFeature,
SchemaGeneratorCollectionOpenApi schemaGeneratorFeatureCollection,
GeoJsonWriterRegistry geoJsonWriterRegistry,
ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
ExtensionRegistry extensionRegistry,
FeaturesCoreProviders providers) {
super(extensionRegistry, providers);
this.schemaGeneratorFeature = schemaGeneratorFeature;
this.schemaGeneratorFeatureCollection = schemaGeneratorFeatureCollection;
this.geoJsonWriterRegistry = geoJsonWriterRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.google.common.collect.ImmutableSortedSet;
import de.ii.ogcapi.features.core.domain.FeatureFormatExtension;
import de.ii.ogcapi.features.core.domain.FeatureTransformationContext;
import de.ii.ogcapi.features.core.domain.FeaturesCoreProviders;
import de.ii.ogcapi.features.geojson.domain.FeatureEncoderGeoJson;
import de.ii.ogcapi.features.geojson.domain.GeoJsonConfiguration;
import de.ii.ogcapi.features.geojson.domain.GeoJsonWriter;
Expand Down Expand Up @@ -43,8 +44,9 @@
@AutoMultiBind
public abstract class FeaturesFormatJsonFgBase extends FeatureFormatExtension {

protected FeaturesFormatJsonFgBase(ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
protected FeaturesFormatJsonFgBase(
ExtensionRegistry extensionRegistry, FeaturesCoreProviders providers) {
super(extensionRegistry, providers);
}

@Override
Expand Down Expand Up @@ -185,6 +187,11 @@ public boolean isComplex() {
return true;
}

@Override
public boolean supportsRootConcat() {
return true;
}

private Optional<Long> getMetadata(Object content, String key) {
if (content instanceof byte[]) {
JsonNode jsonNode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public List<OgcApiQueryParameter> getRuntimeParameters(
}

return configuration
.map(c -> c.getQueryables(apiData, collectionData, featureSchema, providers))
.map(c -> c.getQueryables(apiData, collectionData, featureSchema, providers, true))
.orElse(ImmutableMap.of())
.entrySet()
.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,16 +152,17 @@ default Map<String, FeatureSchema> getQueryables(
FeaturesCoreProviders providers) {
return providers
.getFeatureSchema(apiData, collectionData)
.map(schema -> getQueryables(apiData, collectionData, schema, providers))
.map(schema -> getQueryables(apiData, collectionData, schema, providers, true))
.orElse(ImmutableMap.of());
}

default Map<String, FeatureSchema> getQueryables(
OgcApiDataV2 apiData,
FeatureTypeConfigurationOgcApi collectionData,
FeatureSchema schema,
FeaturesCoreProviders providers) {
return getQueryablesSchema(apiData, collectionData, schema, providers)
FeaturesCoreProviders providers,
boolean cleanupKeys) {
return getQueryablesSchema(apiData, collectionData, schema, providers, cleanupKeys)
.getAllNestedProperties()
.stream()
.filter(FeatureSchema::queryable)
Expand All @@ -173,16 +174,33 @@ default Map<String, FeatureSchema> getQueryables(
ImmutableMap.toImmutableMap(Entry::getKey, Entry::getValue, (first, second) -> second));
}

default FeatureSchema getQueryablesSchema(
default Map<String, FeatureSchema> getQueryables(
OgcApiDataV2 apiData,
FeatureTypeConfigurationOgcApi collectionData,
FeatureSchema schema,
FeaturesCoreProviders providers) {
return getQueryables(apiData, collectionData, schema, providers, false);
}

default FeatureSchema getQueryablesSchema(
OgcApiDataV2 apiData,
FeatureTypeConfigurationOgcApi collectionData,
FeatureSchema schema,
FeaturesCoreProviders providers,
boolean cleanupKeys) {
FeatureQueries featureQueries =
providers.getFeatureProviderOrThrow(apiData, collectionData, FeatureProvider::queries);

return featureQueries.getQueryablesSchema(
schema, getIncluded(), getExcluded(), getPathSeparator().toString());
schema, getIncluded(), getExcluded(), getPathSeparator().toString(), cleanupKeys);
}

default FeatureSchema getQueryablesSchema(
OgcApiDataV2 apiData,
FeatureTypeConfigurationOgcApi collectionData,
FeatureSchema schema,
FeaturesCoreProviders providers) {
return getQueryablesSchema(apiData, collectionData, schema, providers, false);
}

abstract class Builder extends ExtensionConfiguration.Builder {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@
public abstract class FeaturesFormatCityJsonBase extends FeatureFormatExtension {

public static final String IGNORE = "ignore";
protected final FeaturesCoreProviders providers;
private final Values<Codelist> codelistStore;
protected final FeaturesCoreValidation featuresCoreValidator;
protected final SchemaGeneratorOpenApi schemaGeneratorFeature;
Expand All @@ -108,8 +107,7 @@ public FeaturesFormatCityJsonBase(
CrsTransformerFactory crsTransformerFactory,
CrsInfo crsInfo,
ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
this.providers = providers;
super(extensionRegistry, providers);
this.codelistStore = valueStore.forType(Codelist.class);
this.featuresCoreValidator = featuresCoreValidator;
this.schemaGeneratorFeature = schemaGeneratorFeature;
Expand Down Expand Up @@ -208,6 +206,11 @@ public boolean canEncodeFeatures() {
return true;
}

@Override
public boolean supportsRootConcat() {
return true;
}

protected Optional<FeatureTokenEncoder<?>> getFeatureEncoder(
FeatureTransformationContext transformationContext,
@SuppressWarnings("unused") Optional<Locale> language,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import de.ii.ogcapi.features.core.domain.FeatureFormatExtension;
import de.ii.ogcapi.features.core.domain.FeatureTransformationContext;
import de.ii.ogcapi.features.core.domain.FeaturesCoreConfiguration;
import de.ii.ogcapi.features.core.domain.FeaturesCoreProviders;
import de.ii.ogcapi.foundation.domain.ApiMediaType;
import de.ii.ogcapi.foundation.domain.ApiMediaTypeContent;
import de.ii.ogcapi.foundation.domain.ExtensionConfiguration;
Expand Down Expand Up @@ -46,8 +47,9 @@ public class PolicyAttributeFeaturesFormat extends FeatureFormatExtension {
.build();

@Inject
public PolicyAttributeFeaturesFormat(ExtensionRegistry extensionRegistry) {
super(extensionRegistry);
public PolicyAttributeFeaturesFormat(
ExtensionRegistry extensionRegistry, FeaturesCoreProviders providers) {
super(extensionRegistry, providers);
}

@Override
Expand Down Expand Up @@ -75,6 +77,11 @@ public boolean canEncodeFeatures() {
return true;
}

@Override
public boolean supportsRootConcat() {
return true;
}

@Override
public Optional<PropertyTransformations> getPropertyTransformations(
FeatureTypeConfigurationOgcApi collectionData) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ public Cql2Expression parse(

Optional<FeatureSchema> primaryGeometry =
providers
.getFeatureSchema(api.getData(), collectionData)
.getQueryablesSchema(api.getData(), collectionData)
.orElseThrow(
() ->
new IllegalStateException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public Cql2Expression parse(

FeatureSchema featureSchema =
providers
.getFeatureSchema(api.getData(), collectionData)
.getQueryablesSchema(api.getData(), collectionData)
.orElseThrow(
() ->
new IllegalStateException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,67 @@
import de.ii.xtraplatform.features.domain.FeatureSchema;
import de.ii.xtraplatform.features.domain.FeatureTokenEncoder;
import de.ii.xtraplatform.features.domain.transform.PropertyTransformations;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@AutoMultiBind
public abstract class FeatureFormatExtension implements FormatExtension {

private static final Logger LOGGER = LoggerFactory.getLogger(FeatureFormatExtension.class);

protected final ExtensionRegistry extensionRegistry;
protected final FeaturesCoreProviders providers;
private final Set<String> warned;

protected FeatureFormatExtension(ExtensionRegistry extensionRegistry) {
protected FeatureFormatExtension(
ExtensionRegistry extensionRegistry, FeaturesCoreProviders providers) {
this.extensionRegistry = extensionRegistry;
this.providers = providers;
this.warned = new HashSet<>();
}

@Override
public boolean isEnabledForApi(OgcApiDataV2 apiData, String collectionId) {
boolean enabled = FormatExtension.super.isEnabledForApi(apiData, collectionId);

if (!enabled) {
return false;
}

return checkRootConcat(apiData);
}

@Override
public boolean isEnabledForApi(OgcApiDataV2 apiData) {
boolean enabled = FormatExtension.super.isEnabledForApi(apiData);

if (!enabled) {
return false;
}

return checkRootConcat(apiData);
}

private boolean checkRootConcat(OgcApiDataV2 apiData) {
if (supportsRootConcat()) {
return true;
}

if (providers.hasAnyRootConcat(apiData)) {
if (warned.add(this.getClass() + apiData.getId())) {
LOGGER.warn(
"{} does not support root concatenation in the feature schema, the format will be disabled.",
getMediaType().label());
}
return false;
}
return true;
}

public abstract ApiMediaType getCollectionMediaType();
Expand Down Expand Up @@ -138,6 +187,10 @@ public boolean isForHumans() {
return false;
}

public boolean supportsRootConcat() {
return false;
}

public Map<String, String> getDefaultProfiles(OgcApiDataV2 apiData, String collectionId) {
return apiData
.getExtension(getBuildingBlockConfigurationType(), collectionId)
Expand Down
Loading