Smart Data Loader
Data Store
In addition to the parameters common to each DataStore
configuration such 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 database 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 available will appear. Uncheck the attributes that should not be included in the XSD and the mapping file.
Meteo Stations example
This section provides an example of configuring the DataStore
with weather station information.
Note
This example is intended to be illustrative of a general approach, and does not reflect a formally defined schema or information model. Also, more complicated scenarios may require significantly more work.
A diagram of the entities involved is shown below:
Entities diagram
Note
As shown, the dataset consists of:
- A One to Many relationship between the
meteo_stations
andmeteo_observations
tables. - A Many to Many relationship between the
meteo_stations
andmeteo_maintainers
tables, mapped by the relation tablemeteo_stations_maintainers
. - A Many to One relationship between the
meteo_observations
and themeteo_parameters
tables.
Assuming 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:
Smart Data Loader configuration page
After having selected the root entity as meteo-stations, a schema, which will be used to generate the XSD and mappings file, will appear. Each attribute/entity can be unchecked to avoid it being 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.
The generated mappings file for this example are explained below.
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>
App-Schema 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>maintainer_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 direct modification of the mappings and XSD type definition. However it can be used as a starting point to generate configuration files that can be customized as required. This is the suggested workflow for such a use case:
- Create a new smart-data-loader store, select the desired PostGIS store, and then the root entity and save it.
- Go to the geoserver datadir and identify the Smart Data Loader store folder under the workspace that was selected while configuring it. An
app-schema-mappings
directory should be in that store folder. - Copy and paste the files contained in that directory to another directory 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 containing the modified files.