Smart Data Loader¶
Data Store¶
In addition to the parameters common to each DataStore
configuration as workspace
, name
and description
, the page shows the following connection parameters in the dedicated section:
Data store name
: the name of the PostGISDataStore
already created under the same workspace. It will be used to access the database and build xsd and mappings file based on the databse metadata.Root entity
: the name of the DB table to be used as the root FeatureType to build the xsd and the mapping file.
Once selected the root entity a diagram of the entities at stake will appear, allowing you to uncheck the attributes that are not meant to be included in the xsd and the mapping file.
Meteo Stations example¶
To show in details how to configure the DataStore
we will use the Meteo Stations use case.
Warning
This is an oversimplified use case.
Below a diagram of the entities involved:
As it is possible to see, the dataset consists of:
A One to Many relationship between the
meteo-stations
andmeteo-observations
tables.A Many to Many relationship between the
meteo-
themeteo-maintainers
tables, mapped by the relation table meteo-stations-maintainers.A Many to One relationship between the
meteo-observations
and themeteo-parameters
tables.
Assuming to have a postgis datastore named meteos-simple under the st workspace, by opening the Smart Data Loader page we will have to select the desired workspace and the postgis datastore belonging to the selected workspace, in this case the meteos-postgis one:
After having selected the root entity as meteo-stations, a schema, which will be the one used to generate xsd and mappings file, will appear. Each attribute/entity can be unchecked to avoid it to be included in the generated mappings.
..figure:: images/store-relations.png
Smart Data Loader configuration page - entities’ tree
After pressing the save button, the files will be generated automatically in the store data-dir directory under app-schema-mappings
directory.
Below the generated mappings file for the use case explained here.
GML schema definition:
<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:st="http://www.stations.org/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.stations.org/1.0" version="1.0">
<xs:import namespace="http://www.opengis.net/gml/3.2" schemaLocation="http://schemas.opengis.net/gml/3.2.1/gml.xsd"/>
<xs:complexType name="MeteoStationsType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="0" name="code" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="common_name" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="position" type="gml:GeometryPropertyType"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="meteoObservations" type="st:MeteoObservationsPropertyType"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="meteoStationsMaintainers" type="st:MeteoStationsMaintainersPropertyType"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MeteoStationsFeature" substitutionGroup="gml:AbstractFeature" type="st:MeteoStationsType"/>
<xs:complexType name="MeteoObservationsType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="0" name="time" type="xs:dateTime"/>
<xs:element maxOccurs="1" minOccurs="0" name="value" type="xs:double"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="meteoParameters" type="st:MeteoParametersPropertyType"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MeteoObservationsFeature" substitutionGroup="gml:AbstractFeature" type="st:MeteoObservationsType"/>
<xs:complexType name="MeteoObservationsPropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="st:MeteoObservationsFeature"/>
</xs:sequence>
<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
</xs:complexType>
<xs:complexType name="MeteoParametersType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="0" name="param_name" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="param_unit" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MeteoParametersFeature" substitutionGroup="gml:AbstractFeature" type="st:MeteoParametersType"/>
<xs:complexType name="MeteoParametersPropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="st:MeteoParametersFeature"/>
</xs:sequence>
<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
</xs:complexType>
<xs:complexType name="MeteoStationsMaintainersType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id" type="xs:int"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="meteoMaintainers" type="st:MeteoMaintainersPropertyType"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MeteoStationsMaintainersFeature" substitutionGroup="gml:AbstractFeature" type="st:MeteoStationsMaintainersType"/>
<xs:complexType name="MeteoStationsMaintainersPropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="st:MeteoStationsMaintainersFeature"/>
</xs:sequence>
<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
</xs:complexType>
<xs:complexType name="MeteoMaintainersType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="0" name="id" type="xs:int"/>
<xs:element maxOccurs="1" minOccurs="0" name="name" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="surname" type="xs:string"/>
<xs:element maxOccurs="1" minOccurs="0" name="company" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MeteoMaintainersFeature" substitutionGroup="gml:AbstractFeature" type="st:MeteoMaintainersType"/>
<xs:complexType name="MeteoMaintainersPropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="st:MeteoMaintainersFeature"/>
</xs:sequence>
<xs:attributeGroup ref="gml:AssociationAttributeGroup"/>
</xs:complexType>
</xs:schema>
AppSchema mappings file:
<?xml version="1.0" encoding="UTF-8"?><ns3:AppSchemaDataAccess xmlns:ns2="http://www.opengis.net/ogc" xmlns:ns3="http://www.geotools.org/app-schema">
<namespaces>
<Namespace>
<prefix>gml</prefix>
<uri>http://www.opengis.net/gml/3.2</uri>
</Namespace>
<Namespace>
<prefix>st</prefix>
<uri>http://www.stations.org/1.0</uri>
</Namespace>
</namespaces>
<includedTypes/>
<targetTypes>
<FeatureType>
<schemaUri>./meteo_stations-gml.xsd</schemaUri>
</FeatureType>
</targetTypes>
<typeMappings>
<FeatureTypeMapping>
<sourceDataStore>smartappschematest</sourceDataStore>
<sourceType>meteo_stations</sourceType>
<targetElement>st:MeteoStationsFeature</targetElement>
<attributeMappings>
<AttributeMapping>
<targetAttribute>st:MeteoStationsFeature</targetAttribute>
<idExpression>
<OCQL>strConcat('MeteoStationsFeature.',id)</OCQL>
</idExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:id</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:code</targetAttribute>
<sourceExpression>
<OCQL>code</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:common_name</targetAttribute>
<sourceExpression>
<OCQL>common_name</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:position</targetAttribute>
<sourceExpression>
<OCQL>position</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>meteoObservations</targetAttribute>
<sourceExpression>
<linkField>FEATURE_LINK[1]</linkField>
<linkElement>st:MeteoObservationsFeature</linkElement>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>meteoStationsMaintainers</targetAttribute>
<sourceExpression>
<linkField>FEATURE_LINK[1]</linkField>
<linkElement>st:MeteoStationsMaintainersFeature</linkElement>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
</attributeMappings>
</FeatureTypeMapping>
<FeatureTypeMapping>
<sourceDataStore>smartappschematest</sourceDataStore>
<sourceType>meteo_observations</sourceType>
<targetElement>st:MeteoObservationsFeature</targetElement>
<attributeMappings>
<AttributeMapping>
<targetAttribute>FEATURE_LINK[1]</targetAttribute>
<sourceExpression>
<OCQL>station_id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:MeteoObservationsFeature</targetAttribute>
<idExpression>
<OCQL>strConcat('MeteoObservationsFeature.',id)</OCQL>
</idExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:id</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:time</targetAttribute>
<sourceExpression>
<OCQL>time</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:value</targetAttribute>
<sourceExpression>
<OCQL>value</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>meteoParameters</targetAttribute>
<sourceExpression>
<linkField>FEATURE_LINK[1]</linkField>
<linkElement>st:MeteoParametersFeature</linkElement>
<OCQL>parameter_id</OCQL>
</sourceExpression>
</AttributeMapping>
</attributeMappings>
</FeatureTypeMapping>
<FeatureTypeMapping>
<sourceDataStore>smartappschematest</sourceDataStore>
<sourceType>meteo_parameters</sourceType>
<targetElement>st:MeteoParametersFeature</targetElement>
<attributeMappings>
<AttributeMapping>
<targetAttribute>FEATURE_LINK[1]</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:MeteoParametersFeature</targetAttribute>
<idExpression>
<OCQL>strConcat('MeteoParametersFeature.',id)</OCQL>
</idExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:id</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:param_name</targetAttribute>
<sourceExpression>
<OCQL>param_name</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:param_unit</targetAttribute>
<sourceExpression>
<OCQL>param_unit</OCQL>
</sourceExpression>
</AttributeMapping>
</attributeMappings>
</FeatureTypeMapping>
<FeatureTypeMapping>
<sourceDataStore>smartappschematest</sourceDataStore>
<sourceType>meteo_stations_maintainers</sourceType>
<targetElement>st:MeteoStationsMaintainersFeature</targetElement>
<attributeMappings>
<AttributeMapping>
<targetAttribute>FEATURE_LINK[1]</targetAttribute>
<sourceExpression>
<OCQL>station_id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:MeteoStationsMaintainersFeature</targetAttribute>
<idExpression>
<OCQL>strConcat('MeteoStationsMaintainersFeature.',id)</OCQL>
</idExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:id</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>meteoMaintainers</targetAttribute>
<sourceExpression>
<linkField>FEATURE_LINK[1]</linkField>
<linkElement>st:MeteoMaintainersFeature</linkElement>
<OCQL>manteiner_id</OCQL>
</sourceExpression>
</AttributeMapping>
</attributeMappings>
</FeatureTypeMapping>
<FeatureTypeMapping>
<sourceDataStore>smartappschematest</sourceDataStore>
<sourceType>meteo_maintainers</sourceType>
<targetElement>st:MeteoMaintainersFeature</targetElement>
<attributeMappings>
<AttributeMapping>
<targetAttribute>FEATURE_LINK[1]</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:MeteoMaintainersFeature</targetAttribute>
<idExpression>
<OCQL>strConcat('MeteoMaintainersFeature.',id)</OCQL>
</idExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:id</targetAttribute>
<sourceExpression>
<OCQL>id</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:name</targetAttribute>
<sourceExpression>
<OCQL>name</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:surname</targetAttribute>
<sourceExpression>
<OCQL>surname</OCQL>
</sourceExpression>
</AttributeMapping>
<AttributeMapping>
<targetAttribute>st:company</targetAttribute>
<sourceExpression>
<OCQL>company</OCQL>
</sourceExpression>
</AttributeMapping>
</attributeMappings>
</FeatureTypeMapping>
</typeMappings>
<sourceDataStores>
<DataStore>
<id>smartappschematest</id>
<parameters>
<Parameter>
<name>schema</name>
<value>smartappschematest</value>
</Parameter>
<Parameter>
<name>database</name>
<value>mock?sslmode=DISABLE&binaryTransferEnable=bytea</value>
</Parameter>
<Parameter>
<name>port</name>
<value>5432</value>
</Parameter>
<Parameter>
<name>passwd</name>
<value>postgres</value>
</Parameter>
<Parameter>
<name>Expose primary keys</name>
<value>true</value>
</Parameter>
<Parameter>
<name>dbtype</name>
<value>postgis</value>
</Parameter>
<Parameter>
<name>host</name>
<value>localhost</value>
</Parameter>
<Parameter>
<name>user</name>
<value>postgres</value>
</Parameter>
</parameters>
</DataStore>
</sourceDataStores>
</ns3:AppSchemaDataAccess>
Customize smart-data-loader generated mappings and xsd definition¶
The Smart Data Loader does not allow per se to modify the mappings and xsd type definition. However it can be used as a starting point to generate configuration files that one can then manipulates to customize as preferred. This is the suggested workflow for such a use case:
Create a new smart-data-loader store, select the desired PostGIS store, the root entity and save it.
Go in your geoserver datadir and identify the Smart Data Loader store folder under the workspace you chose while configuring it. An
app-schema-mappings
directory should be there.Copy and paste the files contained in that directory to a another directory of your preference, and modify them as needed.
Delete the Smart Data Loader store, and create a new App-Schema store with a uri parameter pointing to the folder where you placed the auto-generated files.