You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2017/03/13 15:28:53 UTC

[30/48] polygene-java git commit: Finish jooq & liquibase powered SQL ES

Finish jooq & liquibase powered SQL ES

POLYGENE-153


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/57eea7b3
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/57eea7b3
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/57eea7b3

Branch: refs/heads/serialization-3.0
Commit: 57eea7b328b1e803f9d05227d48728d0c5b92a4a
Parents: cb4fcac
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Feb 27 14:03:36 2017 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Mar 13 16:27:47 2017 +0100

----------------------------------------------------------------------
 extensions/entitystore-sql/build.gradle         |   9 +-
 extensions/entitystore-sql/src/docs/es-sql.txt  |  14 +-
 .../sql/SQLMapEntityStoreConfiguration.java     |  47 +++
 .../sql/SQLMapEntityStoreMapping.java           |  69 ----
 .../entitystore/sql/SQLMapEntityStoreMixin.java | 124 +++----
 .../sql/SQLMapEntityStoreService.java           |   4 +-
 .../AbstractSQLMapEntityStoreAssembler.java     |  42 ++-
 .../sql/internal/DatabaseSQLService.java        |  96 ------
 .../internal/DatabaseSQLServiceCoreMixin.java   | 159 ---------
 .../sql/internal/DatabaseSQLServiceSpi.java     |  81 -----
 .../sql/internal/DatabaseSQLServiceState.java   |  33 --
 .../DatabaseSQLServiceStatementsMixin.java      | 113 -------
 .../sql/internal/DatabaseSQLStringsBuilder.java | 325 -------------------
 .../DerbySQLDatabaseSQLServiceMixin.java        |  67 ----
 .../internal/H2SQLDatabaseSQLServiceMixin.java  |  64 ----
 .../internal/MySQLDatabaseSQLServiceMixin.java  |  68 ----
 .../PostgreSQLDatabaseSQLServiceMixin.java      |  64 ----
 .../internal/PostgreSQLStringBuilderMixin.java  |  45 ---
 .../sql/internal/SQLEntityState.java            | 189 -----------
 .../internal/SQLiteDatabaseSQLServiceMixin.java |  66 ----
 .../polygene/entitystore/sql/internal/SQLs.java |  29 --
 .../entitystore/sql/internal/package.html       |  24 --
 .../polygene/entitystore/sql/changelog.xml      |  37 +++
 .../sql/DerbySQLEntityStoreTest.java            |  17 +-
 .../entitystore/sql/MySQLEntityStoreTest.java   |  14 +-
 .../sql/PostgreSQLEntityStoreTest.java          |  12 +-
 .../entitystore/sql/SQLiteEntityStoreTest.java  |   3 +-
 .../test/resources/mysql-datasource.properties  |   2 +-
 .../sql/SQLIndexingEngineConfiguration.java     |  31 ++
 .../AbstractSQLIndexQueryAssembler.java         |   4 +-
 .../support/skeletons/AbstractSQLStartup.java   |  13 +-
 .../postgresql/PostgreSQLDBIntegrityTest.java   |   6 +-
 libraries/sql-liquibase/build.gradle            |   4 +-
 .../sql/liquibase/LiquibaseAssembler.java       |  16 +-
 .../sql/liquibase/LiquibaseConfiguration.java   |  12 +-
 .../library/sql/liquibase/LiquibaseService.java | 133 ++++----
 .../sql/liquibase/LiquibaseServiceTest.java     |   7 +-
 .../library/sql/common/SQLConfiguration.java    |   4 -
 ...taSourceConfigurationManagerServiceTest.java |  18 +-
 .../apache/polygene/sample/sqlsupport/Main.java |   8 -
 .../sql/DerbySQLEntityStorePerformanceTest.java |  35 +-
 .../PostgreSQLEntityStorePerformanceTest.java   |  34 +-
 42 files changed, 373 insertions(+), 1769 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/build.gradle
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/build.gradle b/extensions/entitystore-sql/build.gradle
index 15553dc..0c11fcd 100644
--- a/extensions/entitystore-sql/build.gradle
+++ b/extensions/entitystore-sql/build.gradle
@@ -29,22 +29,15 @@ dependencies {
   api polygene.library( 'sql' )
   api libraries.jooq
 
-  implementation libraries.slf4j_api
   implementation polygene.library( 'sql-liquibase' )
 
-  // TODO Remove java SQL generator dependency
-  implementation libraries.javaSqlGenerator
-  implementation( libraries.javaSqlGeneratorImpl ) {
-    exclude group: 'junit'
-  }
-
   runtimeOnly polygene.core.runtime
 
   testImplementation polygene.internals.testsupport
   testImplementation polygene.library( 'sql-dbcp' )
-  testImplementation libraries.derby // Needed at compile time for polite test shutdown
 
   testRuntimeOnly libraries.logback
+  testRuntimeOnly libraries.derby
   testRuntimeOnly libraries.h2
   testRuntimeOnly libraries.mysql_connector
   testRuntimeOnly libraries.postgres

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/docs/es-sql.txt
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/docs/es-sql.txt b/extensions/entitystore-sql/src/docs/es-sql.txt
index 50e9f31..90a7175 100644
--- a/extensions/entitystore-sql/src/docs/es-sql.txt
+++ b/extensions/entitystore-sql/src/docs/es-sql.txt
@@ -30,6 +30,8 @@ EntityStore service backed by a SQL database.
 This extension fully leverage the <<library-sql>> meaning that you must use it to assemble your DataSource and that you
 get <<library-circuitbreaker,Circuit Breaker>> and <<library-jmx, JMX>> integration for free.
 
+The database schema is managed using <<library-sql-liquibase>>.
+
 TIP: See the <<sample-sql-support>> that demonstrate combined use of <<library-sql>>, <<extension-es-sql>> and
 <<extension-indexing-sql>>.
 
@@ -44,15 +46,17 @@ The following SQL databases are supported:
 Each entity state is stored as a single row so maximum number of entities is the maximum number of rows per table
 supported by the underlying SQL database.
 
-Implementations per database Vendor share a generic codebase but can override about everything SQL. As a consequence
-they can have strong differences in terms of performance if they use vendor specific extensions.
-
 include::../../build/docs/buildinfo/artifact.txt[]
 
 == Configuration ==
 
-SQL EntityStore Configuration is optional and provides only one configuration property: `schemaName` defaulted to
-'polygene_es'. On SQL databases that don't support schemas this configuration property is simply ignored.
+Here are the available configuration properties:
+
+[snippet,java]
+----
+source=extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreConfiguration.java
+tag=assembly
+----
 
 The assembly snippets below show the DataSource assembly alongside the SQL EntityStore assembly. Remember to configure
 the DataSource properly, see <<library-sql>> and <<howto-configure-service>>.

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreConfiguration.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreConfiguration.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreConfiguration.java
new file mode 100644
index 0000000..cd832c0
--- /dev/null
+++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreConfiguration.java
@@ -0,0 +1,47 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.polygene.entitystore.sql;
+
+import org.apache.polygene.api.common.UseDefaults;
+import org.apache.polygene.api.property.Property;
+import org.apache.polygene.library.sql.common.SQLConfiguration;
+
+// START SNIPPET: config
+public interface SQLMapEntityStoreConfiguration extends SQLConfiguration
+{
+    /**
+     * Name of the database schema to use.
+     * Ignored on SQL databases that don't support schemas.
+     */
+    @UseDefaults( "POLYGENE_ES" )
+    @Override
+    Property<String> schemaName();
+
+    /**
+     * Name of the entities table.
+     */
+    @UseDefaults( "POLYGENE_ENTITIES" )
+    Property<String> entityTableName();
+
+    /**
+     * Defines whether the database schema and table should be created if not already present.
+     */
+    @UseDefaults( "true" )
+    Property<Boolean> createIfMissing();
+}
+// END SNIPPET: config

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMapping.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMapping.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMapping.java
deleted file mode 100644
index 67f6066..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMapping.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.polygene.entitystore.sql;
-
-import org.jooq.DataType;
-import org.jooq.impl.SQLDataType;
-
-/**
- * Mapping for the entities table.
- *
- * If you change this once the table is created you'll have to ALTER it yourself.
- */
-public interface SQLMapEntityStoreMapping
-{
-    default String defaultSchemaName()
-    {
-        return "POLYGENE_ES";
-    }
-
-    default String tableName()
-    {
-        return "POLYGENE_ENTITIES";
-    }
-
-    default String identityColumnName()
-    {
-        return "ENTITY_IDENTITY";
-    }
-
-    default String versionColumnName()
-    {
-        return "ENTITY_VERSION";
-    }
-
-    default String stateColumnName()
-    {
-        return "ENTITY_STATE";
-    }
-
-    default DataType<String> identityDataType()
-    {
-        return SQLDataType.VARCHAR( 64 );
-    }
-
-    default DataType<String> versionDataType()
-    {
-        return SQLDataType.VARCHAR( 64 );
-    }
-
-    default DataType<String> stateDataType()
-    {
-        return SQLDataType.VARCHAR( 10 * 1024 );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMixin.java
index 7e08daf..77a7640 100644
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMixin.java
+++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreMixin.java
@@ -22,13 +22,17 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 import java.util.stream.Stream;
 import javax.json.Json;
 import javax.sql.DataSource;
-import org.apache.polygene.api.common.Optional;
+import liquibase.Contexts;
+import liquibase.Liquibase;
+import liquibase.database.Database;
+import liquibase.database.ObjectQuotingStrategy;
+import liquibase.exception.LiquibaseException;
 import org.apache.polygene.api.configuration.Configuration;
 import org.apache.polygene.api.entity.EntityDescriptor;
 import org.apache.polygene.api.entity.EntityReference;
@@ -37,9 +41,8 @@ import org.apache.polygene.api.injection.scope.This;
 import org.apache.polygene.api.injection.scope.Uses;
 import org.apache.polygene.api.service.ServiceActivation;
 import org.apache.polygene.api.service.ServiceDescriptor;
-import org.apache.polygene.library.sql.common.SQLConfiguration;
+import org.apache.polygene.library.sql.liquibase.LiquibaseService;
 import org.apache.polygene.spi.entitystore.EntityNotFoundException;
-import org.apache.polygene.spi.entitystore.EntityStoreException;
 import org.apache.polygene.spi.entitystore.helpers.JSONKeys;
 import org.apache.polygene.spi.entitystore.helpers.MapEntityStore;
 import org.jooq.DSLContext;
@@ -51,26 +54,27 @@ import org.jooq.Schema;
 import org.jooq.Table;
 import org.jooq.conf.Settings;
 import org.jooq.impl.DSL;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-// TODO Implement optimistic locking! Maybe as a SPI helper (in-progress)
-// TODO Add schema version data into the DB, check it
-// TODO Remove old SQL ES Code
+// TODO Remove old SQL ES Code and spurious dependencies
 public class SQLMapEntityStoreMixin
     implements ServiceActivation, MapEntityStore
 {
-    private static final Logger LOGGER = LoggerFactory.getLogger( SQLMapEntityStoreService.class );
+    private static final String TABLE_NAME_LIQUIBASE_PARAMETER = "es-sql.table";
+    private static final String IDENTITY_COLUMN_NAME = "ENTITY_IDENTITY";
+    private static final String VERSION_COLUMN_NAME = "ENTITY_VERSION";
+    private static final String STATE_COLUMN_NAME = "ENTITY_STATE";
 
     @Service
     private DataSource dataSource;
 
+    @Service
+    private LiquibaseService liquibaseService;
+
     @Uses
     private ServiceDescriptor descriptor;
 
     @This
-    @Optional
-    private Configuration<SQLConfiguration> configuration;
+    private Configuration<SQLMapEntityStoreConfiguration> configuration;
 
     private Schema schema;
     private Table<Record> table;
@@ -82,40 +86,64 @@ public class SQLMapEntityStoreMixin
     @Override
     public void activateService() throws Exception
     {
+        configuration.refresh();
+        SQLMapEntityStoreConfiguration config = configuration.get();
+
+        // Prepare jooq DSL
         SQLDialect dialect = descriptor.metaInfo( SQLDialect.class );
         Settings settings = descriptor.metaInfo( Settings.class );
-        SQLMapEntityStoreMapping mapping = descriptor.metaInfo( SQLMapEntityStoreMapping.class );
-        String schemaName = getConfiguredSchemaName( mapping.defaultSchemaName() );
-        if( schemaName == null )
-        {
-            throw new EntityStoreException( "Schema name must not be null." );
-        }
-        schema = DSL.schema( DSL.name( schemaName.toUpperCase() ) );
+        String schemaName = config.schemaName().get();
+        String tableName = config.entityTableName().get();
+        schema = DSL.schema( DSL.name( schemaName ) );
         table = DSL.table(
             dialect.equals( SQLDialect.SQLITE )
-            ? DSL.name( mapping.tableName() )
-            : DSL.name( schema.getName(), mapping.tableName() )
+            ? DSL.name( tableName )
+            : DSL.name( schema.getName(), tableName )
         );
-        identityColumn = DSL.field( mapping.identityColumnName(), String.class );
-        versionColumn = DSL.field( mapping.versionColumnName(), String.class );
-        stateColumn = DSL.field( mapping.stateColumnName(), String.class );
-
+        identityColumn = DSL.field( DSL.name( IDENTITY_COLUMN_NAME ), String.class );
+        versionColumn = DSL.field( DSL.name( VERSION_COLUMN_NAME ), String.class );
+        stateColumn = DSL.field( DSL.name( STATE_COLUMN_NAME ), String.class );
         dsl = DSL.using( dataSource, dialect, settings );
 
-        if( !dialect.equals( SQLDialect.SQLITE )
-            && dsl.meta().getSchemas().stream().noneMatch( s -> schema.getName().equals( s.getName() ) ) )
+        // Eventually create schema and apply Liquibase changelog
+        if( config.createIfMissing().get() )
         {
-            dsl.createSchema( schema ).execute();
+            if( !dialect.equals( SQLDialect.SQLITE )
+                && dsl.meta().getSchemas().stream().noneMatch( s -> schema.getName().equalsIgnoreCase( s.getName() ) ) )
+            {
+                dsl.createSchema( schema ).execute();
+            }
+
+            applyLiquibaseChangelog( dialect );
         }
+    }
 
-        if( dsl.meta().getTables().stream().noneMatch( t -> table.getName().equals( t.getName() ) ) )
+    private void applyLiquibaseChangelog( SQLDialect dialect ) throws SQLException, LiquibaseException
+    {
+        Liquibase liquibase = liquibaseService.newConnectedLiquibase();
+        Database db = liquibase.getDatabase();
+        db.setObjectQuotingStrategy( ObjectQuotingStrategy.QUOTE_ALL_OBJECTS );
+        try
         {
-            dsl.createTable( table )
-               .column( identityColumn, mapping.identityDataType().nullable( false ) )
-               .column( versionColumn, mapping.versionDataType().nullable( false ) )
-               .column( stateColumn, mapping.stateDataType().nullable( false ) )
-               .constraint( DSL.constraint( "ENTITY_IDENTITY_CONSTRAINT" ).primaryKey( identityColumn ) )
-               .execute();
+            if( !dialect.equals( SQLDialect.SQLITE ) )
+            {
+                if( db.supportsSchemas() )
+                {
+                    db.setDefaultSchemaName( schema.getName() );
+                    db.setLiquibaseSchemaName( schema.getName() );
+                }
+                if( db.supportsCatalogs() )
+                {
+                    db.setDefaultCatalogName( schema.getName() );
+                    db.setLiquibaseCatalogName( schema.getName() );
+                }
+            }
+            liquibase.getChangeLogParameters().set( TABLE_NAME_LIQUIBASE_PARAMETER, table.getName() );
+            liquibase.update( new Contexts() );
+        }
+        finally
+        {
+            db.close();
         }
     }
 
@@ -210,30 +238,4 @@ public class SQLMapEntityStoreMixin
         } );
         dsl.batch( operations ).execute();
     }
-
-
-    /**
-     * Configuration is optional at both assembly and runtime.
-     */
-    protected String getConfiguredSchemaName( String defaultSchemaName )
-    {
-        if( configuration == null )
-        {
-            Objects.requireNonNull( defaultSchemaName, "default schema name" );
-            LOGGER.debug( "No configuration, will use default schema name: '{}'", defaultSchemaName );
-            return defaultSchemaName;
-        }
-        String result = configuration.get().schemaName().get();
-        if( result == null )
-        {
-            Objects.requireNonNull( defaultSchemaName, "default schema name" );
-            result = defaultSchemaName;
-            LOGGER.debug( "No database schema name in configuration, will use default: '{}'", defaultSchemaName );
-        }
-        else
-        {
-            LOGGER.debug( "Will use configured database schema name: '{}'", result );
-        }
-        return result;
-    }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java
index 0ff1e59..7c770df 100644
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java
+++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/SQLMapEntityStoreService.java
@@ -19,9 +19,10 @@ package org.apache.polygene.entitystore.sql;
 
 import org.apache.polygene.api.concern.Concerns;
 import org.apache.polygene.api.configuration.Configuration;
+import org.apache.polygene.api.injection.scope.Uses;
 import org.apache.polygene.api.mixin.Mixins;
 import org.apache.polygene.api.service.ServiceActivation;
-import org.apache.polygene.api.service.ServiceComposite;
+import org.apache.polygene.api.service.ServiceDescriptor;
 import org.apache.polygene.spi.entitystore.ConcurrentModificationCheckConcern;
 import org.apache.polygene.spi.entitystore.EntityStateVersions;
 import org.apache.polygene.spi.entitystore.EntityStore;
@@ -39,7 +40,6 @@ public interface SQLMapEntityStoreService
     JSONMapEntityStoreActivation,
     EntityStore,
     EntityStateVersions,
-    ServiceComposite,
     Configuration
 {
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/assembly/AbstractSQLMapEntityStoreAssembler.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/assembly/AbstractSQLMapEntityStoreAssembler.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/assembly/AbstractSQLMapEntityStoreAssembler.java
index 4e205d1..aac6dfc 100644
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/assembly/AbstractSQLMapEntityStoreAssembler.java
+++ b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/assembly/AbstractSQLMapEntityStoreAssembler.java
@@ -22,10 +22,12 @@ import org.apache.polygene.api.identity.StringIdentity;
 import org.apache.polygene.bootstrap.Assemblers;
 import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.ModuleAssembly;
-import org.apache.polygene.entitystore.sql.SQLMapEntityStoreMapping;
+import org.apache.polygene.entitystore.sql.SQLMapEntityStoreConfiguration;
 import org.apache.polygene.entitystore.sql.SQLMapEntityStoreService;
-import org.apache.polygene.library.sql.common.SQLConfiguration;
+import org.apache.polygene.library.sql.liquibase.LiquibaseAssembler;
+import org.apache.polygene.library.sql.liquibase.LiquibaseConfiguration;
 import org.jooq.SQLDialect;
+import org.jooq.conf.RenderNameStyle;
 import org.jooq.conf.Settings;
 
 /**
@@ -35,6 +37,9 @@ public abstract class AbstractSQLMapEntityStoreAssembler<AssemblerType>
     extends Assemblers.VisibilityIdentityConfig<AssemblerType>
 {
     public static final Identity DEFAULT_ENTITYSTORE_IDENTITY = new StringIdentity( "entitystore-sql" );
+    private static final String DEFAULT_CHANGELOG_PATH = "org/apache/polygene/entitystore/sql/changelog.xml";
+
+    private String changelogPath = DEFAULT_CHANGELOG_PATH;
 
     @Override
     public void assemble( ModuleAssembly module )
@@ -49,37 +54,44 @@ public abstract class AbstractSQLMapEntityStoreAssembler<AssemblerType>
         {
             throw new AssemblyException( "Settings must not be null" );
         }
-        SQLMapEntityStoreMapping mapping = getMapping();
-        if( settings == null )
+
+        String identity = ( hasIdentity() ? identity() : DEFAULT_ENTITYSTORE_IDENTITY ).toString();
+
+        LiquibaseAssembler liquibase = new LiquibaseAssembler().identifiedBy( identity + "-liquibase" );
+        if( hasConfig() )
         {
-            throw new AssemblyException( "SQLMapEntityStoreSchema must not be null" );
+            liquibase.withConfig( configModule(), configVisibility() );
+            LiquibaseConfiguration liquibaseconfig = configModule().forMixin( LiquibaseConfiguration.class )
+                                                                   .declareDefaults();
+            liquibaseconfig.changeLog().set( changelogPath );
         }
+        liquibase.assemble( module );
 
         module.services( SQLMapEntityStoreService.class )
-              .identifiedBy( ( hasIdentity() ? identity() : DEFAULT_ENTITYSTORE_IDENTITY ).toString() )
+              .identifiedBy( identity )
               .visibleIn( visibility() )
               .setMetaInfo( dialect )
-              .setMetaInfo( settings )
-              .setMetaInfo( mapping );
+              .setMetaInfo( settings );
 
         if( hasConfig() )
         {
-            configModule().entities( SQLConfiguration.class ).visibleIn( configVisibility() );
+            configModule().entities( SQLMapEntityStoreConfiguration.class ).visibleIn( configVisibility() );
         }
     }
 
-    protected Settings getSettings()
+    public AssemblerType withLiquibaseChangelog( String changelogPath )
     {
-        return new Settings();
+        this.changelogPath = changelogPath;
+        return (AssemblerType) this;
     }
 
-    protected SQLDialect getSQLDialect()
+    protected Settings getSettings()
     {
-        return SQLDialect.DEFAULT;
+        return new Settings().withRenderNameStyle( RenderNameStyle.QUOTED );
     }
 
-    protected SQLMapEntityStoreMapping getMapping()
+    protected SQLDialect getSQLDialect()
     {
-        return new SQLMapEntityStoreMapping() {};
+        return SQLDialect.DEFAULT;
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLService.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLService.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLService.java
deleted file mode 100644
index fddb19f..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLService.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.api.service.ServiceComposite;
-
-@SuppressWarnings( "PublicInnerClass" )
-public interface DatabaseSQLService
-{
-    interface DatabaseSQLServiceComposite extends DatabaseSQLService, ServiceComposite
-    {
-    }
-
-    final class EntityValueResult
-    {
-        private final Reader reader;
-
-        EntityValueResult( Reader reader )
-        {
-            this.reader = reader;
-        }
-
-        /**
-         * @return the reader
-         */
-        public Reader getReader()
-        {
-            return reader;
-        }
-    }
-
-    void startDatabase()
-        throws Exception;
-
-    void stopDatabase()
-        throws Exception;
-
-    Connection getConnection()
-        throws SQLException;
-
-    PreparedStatement prepareGetEntityStatement( Connection connection )
-        throws SQLException;
-
-    PreparedStatement prepareGetAllEntitiesStatement( Connection connection )
-        throws SQLException;
-
-    PreparedStatement prepareInsertEntityStatement( Connection connection )
-        throws SQLException;
-
-    PreparedStatement prepareUpdateEntityStatement( Connection connection )
-        throws SQLException;
-
-    PreparedStatement prepareRemoveEntityStatement( Connection connection )
-        throws SQLException;
-
-    void populateGetEntityStatement( PreparedStatement ps, EntityReference ref )
-        throws SQLException;
-
-    void populateGetAllEntitiesStatement( PreparedStatement ps )
-        throws SQLException;
-
-    void populateInsertEntityStatement( PreparedStatement ps, EntityReference ref, String entity )
-        throws SQLException;
-
-    void populateUpdateEntityStatement( PreparedStatement ps, EntityReference ref, String entity )
-        throws SQLException;
-
-    void populateRemoveEntityStatement( PreparedStatement ps, EntityReference ref )
-        throws SQLException;
-
-    Reader getEntityStateReader( ResultSet rs )
-        throws SQLException;
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceCoreMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceCoreMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceCoreMixin.java
deleted file mode 100644
index 3c37457..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceCoreMixin.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Objects;
-import javax.sql.DataSource;
-import org.apache.polygene.api.configuration.Configuration;
-import org.apache.polygene.api.injection.scope.Service;
-import org.apache.polygene.api.injection.scope.Structure;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.api.injection.scope.Uses;
-import org.apache.polygene.api.service.ServiceDescriptor;
-import org.apache.polygene.api.structure.Application;
-import org.apache.polygene.api.structure.Application.Mode;
-import org.apache.polygene.library.sql.common.SQLConfiguration;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.apache.polygene.spi.entitystore.EntityStoreException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sql.generation.api.vendor.SQLVendor;
-
-@SuppressWarnings( "ProtectedField" )
-public abstract class DatabaseSQLServiceCoreMixin
-        implements DatabaseSQLService
-{
-
-    private static final Logger LOGGER = LoggerFactory.getLogger( DatabaseSQLServiceCoreMixin.class );
-
-    @Structure
-    private Application application;
-
-    @Service
-    private DataSource dataSource;
-
-    @This
-    private DatabaseSQLServiceState state;
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    @This
-    private DatabaseSQLStringsBuilder sqlStrings;
-
-    @Uses
-    private ServiceDescriptor descriptor;
-
-    @This
-    private Configuration<SQLConfiguration> configuration;
-
-    @Override
-    public Connection getConnection()
-            throws SQLException
-    {
-        return dataSource.getConnection();
-    }
-
-    @Override
-    public void startDatabase()
-            throws Exception
-    {
-        Connection connection = getConnection();
-        String schema = this.getConfiguredSchemaName( SQLs.DEFAULT_SCHEMA_NAME );
-        if ( schema == null ) {
-            throw new EntityStoreException( "Schema name must not be null." );
-        } else {
-            state.schemaName().set( schema );
-            state.vendor().set( this.descriptor.metaInfo( SQLVendor.class ) );
-
-            sqlStrings.init();
-
-            if ( !spi.schemaExists( connection ) ) {
-                LOGGER.debug( "Database Schema '{}' NOT found!", schema );
-                Statement stmt = null;
-                try {
-                    stmt = connection.createStatement();
-                    for ( String sql : sqlStrings.buildSQLForSchemaCreation() ) {
-                        stmt.execute( sql );
-                    }
-                } finally {
-                    SQLUtil.closeQuietly( stmt );
-                }
-                LOGGER.debug( "Database Schema '{}' created", schema );
-            }
-
-            if ( !spi.tableExists( connection ) ) {
-                Statement stmt = null;
-                try {
-                    stmt = connection.createStatement();
-                    for ( String sql : sqlStrings.buildSQLForTableCreation() ) {
-                        stmt.execute( sql );
-                    }
-                    for ( String sql : sqlStrings.buildSQLForIndexCreation() ) {
-                        stmt.execute( sql );
-                    }
-                } finally {
-                    SQLUtil.closeQuietly( stmt );
-                }
-                LOGGER.trace( "Table {} created", SQLs.TABLE_NAME );
-            }
-
-            connection.setAutoCommit( false );
-
-        }
-
-        SQLUtil.closeQuietly( connection );
-
-    }
-
-    @Override
-    public void stopDatabase()
-            throws Exception
-    {
-        if ( Mode.production == application.mode() ) {
-            // NOOP
-        }
-    }
-
-    /**
-     * Configuration is optional at both assembly and runtime.
-     */
-    protected String getConfiguredSchemaName( String defaultSchemaName )
-    {
-        if ( configuration == null ) {
-            Objects.requireNonNull(  defaultSchemaName, "default schema name" );
-            LOGGER.debug( "No configuration, will use default schema name: '{}'", defaultSchemaName );
-            return defaultSchemaName;
-        }
-        String result = configuration.get().schemaName().get();
-        if ( result == null ) {
-            Objects.requireNonNull( defaultSchemaName, "default schema name" );
-            result = defaultSchemaName;
-            LOGGER.debug( "No database schema name in configuration, will use default: '{}'", defaultSchemaName );
-        } else {
-            LOGGER.debug( "Will use configured database schema name: '{}'", result );
-        }
-        return result;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceSpi.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceSpi.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceSpi.java
deleted file mode 100644
index 9042182..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceSpi.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public interface DatabaseSQLServiceSpi
-{
-
-    boolean schemaExists( Connection connection )
-            throws SQLException;
-
-    String getCurrentSchemaName();
-
-    boolean tableExists( Connection connection )
-            throws SQLException;
-
-    @SuppressWarnings( "PublicInnerClass" )
-    public abstract class CommonMixin
-            implements DatabaseSQLServiceSpi
-    {
-
-        private static final Logger LOGGER = LoggerFactory.getLogger( DatabaseSQLServiceSpi.class );
-
-        @This
-        private DatabaseSQLServiceState state;
-
-        @Override
-        public boolean schemaExists( Connection connection )
-                throws SQLException
-        {
-            ResultSet rs = null;
-            try {
-                Boolean schemaFound = false;
-                rs = connection.getMetaData().getSchemas();
-                String schemaName = this.getCurrentSchemaName();
-
-                while ( rs.next() && !schemaFound ) {
-                    String eachResult = rs.getString( 1 );
-                    LOGGER.trace( "Schema candidate: {}", eachResult );
-                    schemaFound = eachResult.equalsIgnoreCase( schemaName );
-                }
-                LOGGER.trace( "Schema {} found? {}", schemaName, schemaFound );
-                return schemaFound;
-            } finally {
-                SQLUtil.closeQuietly( rs );
-            }
-        }
-
-        @Override
-        public String getCurrentSchemaName()
-        {
-            return this.state.schemaName().get();
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceState.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceState.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceState.java
deleted file mode 100644
index 3e3926d..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceState.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import org.apache.polygene.api.common.Optional;
-import org.apache.polygene.api.property.Property;
-import org.sql.generation.api.vendor.SQLVendor;
-
-public interface DatabaseSQLServiceState
-{
-    @Optional
-    Property<String> schemaName();
-
-    @Optional
-    Property<SQLVendor> vendor();
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceStatementsMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceStatementsMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceStatementsMixin.java
deleted file mode 100644
index cce4568..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLServiceStatementsMixin.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.api.injection.scope.This;
-
-public abstract class DatabaseSQLServiceStatementsMixin
-        implements DatabaseSQLService
-{
-
-    @This
-    private DatabaseSQLStringsBuilder sqlStrings;
-
-    //
-    // Used by the EntityStore, will probably remain the same even if we support several sql servers
-    //
-    @Override
-    public PreparedStatement prepareGetAllEntitiesStatement( Connection connection )
-            throws SQLException
-    {
-        return connection.prepareStatement( sqlStrings.buildSQLForSelectAllEntitiesStatement() );
-    }
-
-    @Override
-    public PreparedStatement prepareGetEntityStatement( Connection connection )
-            throws SQLException
-    {
-        return connection.prepareStatement( sqlStrings.buildSQLForSelectEntityStatement() );
-    }
-
-    @Override
-    public PreparedStatement prepareInsertEntityStatement( Connection connection )
-            throws SQLException
-    {
-        return connection.prepareStatement( sqlStrings.buildSQLForInsertEntityStatement() );
-    }
-
-    @Override
-    public PreparedStatement prepareRemoveEntityStatement( Connection connection )
-            throws SQLException
-    {
-        return connection.prepareStatement( sqlStrings.buildSQLForRemoveEntityStatement() );
-    }
-
-    @Override
-    public PreparedStatement prepareUpdateEntityStatement( Connection connection )
-            throws SQLException
-    {
-        return connection.prepareStatement( sqlStrings.buildSQLForUpdateEntityStatement() );
-    }
-
-    //
-    // Populate statement methods, to move in a separated fragment if needed for multi sql server support
-    //
-    @Override
-    public void populateGetAllEntitiesStatement( PreparedStatement ps )
-            throws SQLException
-    {
-        // Nothing to do.
-    }
-
-    @Override
-    public void populateGetEntityStatement( PreparedStatement ps, EntityReference ref )
-            throws SQLException
-    {
-        ps.setString( 1, ref.identity().toString() );
-    }
-
-    @Override
-    public void populateInsertEntityStatement( PreparedStatement ps, EntityReference ref, String entity )
-            throws SQLException
-    {
-        ps.setString( 1, ref.identity().toString() );
-        ps.setString( 2, entity );
-    }
-
-    @Override
-    public void populateRemoveEntityStatement( PreparedStatement ps, EntityReference ref )
-            throws SQLException
-    {
-        ps.setString( 1, ref.identity().toString() );
-    }
-
-    @Override
-    public void populateUpdateEntityStatement( PreparedStatement ps, EntityReference ref, String entity )
-            throws SQLException
-    {
-        ps.setString( 1, ref.identity().toString() );
-        ps.setString( 2, entity );
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLStringsBuilder.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLStringsBuilder.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLStringsBuilder.java
deleted file mode 100644
index 6fb04cb..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DatabaseSQLStringsBuilder.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with work for additional information
- *  regarding copyright ownership.  The ASF licenses file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import org.apache.polygene.api.injection.scope.This;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sql.generation.api.grammar.builders.modification.DeleteBySearchBuilder;
-import org.sql.generation.api.grammar.builders.modification.UpdateBySearchBuilder;
-import org.sql.generation.api.grammar.common.SQLStatement;
-import org.sql.generation.api.grammar.common.datatypes.SQLDataType;
-import org.sql.generation.api.grammar.definition.table.UniqueSpecification;
-import org.sql.generation.api.grammar.factories.BooleanFactory;
-import org.sql.generation.api.grammar.factories.ColumnsFactory;
-import org.sql.generation.api.grammar.factories.DefinitionFactory;
-import org.sql.generation.api.grammar.factories.LiteralFactory;
-import org.sql.generation.api.grammar.factories.ModificationFactory;
-import org.sql.generation.api.grammar.factories.QueryFactory;
-import org.sql.generation.api.grammar.factories.TableReferenceFactory;
-import org.sql.generation.api.vendor.SQLVendor;
-
-public interface DatabaseSQLStringsBuilder
-{
-    void init();
-
-    String[] buildSQLForSchemaCreation();
-
-    String[] buildSQLForIndexCreation();
-
-    String[] buildSQLForTableCreation();
-
-    String buildSQLForSelectAllEntitiesStatement();
-
-    String buildSQLForSelectEntityStatement();
-
-    String buildSQLForInsertEntityStatement();
-
-    String buildSQLForUpdateEntityStatement();
-
-    String buildSQLForRemoveEntityStatement();
-
-    abstract class CommonMixin
-        implements DatabaseSQLStringsBuilder
-    {
-        private static final Logger LOGGER = LoggerFactory.getLogger( DatabaseSQLStringsBuilder.class );
-
-        @This
-        private DatabaseSQLServiceState dbState;
-
-        private SQLVendor vendor;
-        private String schemaName;
-
-        private String[] schemaCreationSQLs;
-        private String[] indexCreationSQLs;
-        private String[] tableCreationSQLs;
-
-        private String selectAllEntitiesSQL;
-        private String selectEntitySQL;
-        private String insertEntitySQL;
-        private String updateEntitySQL;
-        private String removeEntitySQL;
-
-        @Override
-        public void init()
-        {
-            vendor = dbState.vendor().get();
-            schemaName = dbState.schemaName().get();
-            schemaCreationSQLs = toString( createSchemaStatements( vendor ) );
-            indexCreationSQLs = toString( createIndicesStatements( vendor ) );
-            tableCreationSQLs = toString( createTableStatements( vendor ) );
-            selectAllEntitiesSQL = vendor.toString( createSelectAllEntitiesStatement( vendor ) );
-            selectEntitySQL = vendor.toString( createSelectEntityStatement( vendor ) );
-            insertEntitySQL = vendor.toString( createInsertEntityStatement( vendor ) );
-            updateEntitySQL = vendor.toString( createUpdateEntityStatement( vendor ) );
-            removeEntitySQL = vendor.toString( createRemoveEntityStatement( vendor ) );
-
-            if( LOGGER.isTraceEnabled() )
-            {
-                LOGGER.trace( "SQL for schema creation: {}", Arrays.asList( schemaCreationSQLs ) );
-                LOGGER.trace( "SQL for index creation: {}", Arrays.asList( indexCreationSQLs ) );
-                LOGGER.trace( "SQL for table creation: {}", Arrays.asList( tableCreationSQLs ) );
-                LOGGER.trace( "SQL for select all entities: {}", selectAllEntitiesSQL );
-                LOGGER.trace( "SQL for select entity: {}", selectEntitySQL );
-                LOGGER.trace( "SQL for insert entity: {}", insertEntitySQL );
-                LOGGER.trace( "SQL for update entity: {}", updateEntitySQL );
-                LOGGER.trace( "SQL for remove entity: {}", removeEntitySQL );
-            }
-        }
-
-        protected String[] toString( SQLStatement[] stmts )
-        {
-            List<String> result = new ArrayList<>();
-            if( stmts != null )
-            {
-                for( Integer idx = 0; idx < stmts.length; ++idx )
-                {
-                    SQLStatement statement = stmts[ idx ];
-                    if( statement != null )
-                    {
-                        String stringStatement = vendor.toString( statement );
-                        if( stringStatement != null && stringStatement.length() > 0 )
-                        {
-                            result.add( vendor.toString( statement ) );
-                        }
-                    }
-                }
-            }
-            return result.toArray( new String[ result.size() ] );
-        }
-
-        protected SQLVendor getVendor()
-        {
-            return vendor;
-        }
-
-        protected String getSchemaName()
-        {
-            return schemaName;
-        }
-
-        protected SQLStatement[] createSchemaStatements( SQLVendor vendor )
-        {
-            return new SQLStatement[] {
-                vendor.getDefinitionFactory().createSchemaDefinitionBuilder()
-                      .setSchemaName( schemaName ).createExpression()
-            };
-        }
-
-        protected SQLStatement[] createIndicesStatements( SQLVendor vendor )
-        {
-            return new SQLStatement[] {};
-        }
-
-        protected SQLStatement[] createTableStatements( SQLVendor vendor )
-        {
-            DefinitionFactory d = vendor.getDefinitionFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-
-            return new SQLStatement[] {
-                d.createTableDefinitionBuilder()
-                 .setTableName( t.tableName( getSchemaName(), SQLs.TABLE_NAME ) )
-                 .setTableContentsSource(
-                     d.createTableElementListBuilder()
-                      .addTableElement( d.createColumnDefinition( SQLs.ENTITY_IDENTITY_COLUMN_NAME,
-                                                                  getIDType(), false ) )
-                      .addTableElement( d.createColumnDefinition( SQLs.ENTITY_VERSION_COLUMN_NAME,
-                                                                  getVersionType(), false ) )
-                      .addTableElement( d.createColumnDefinition( SQLs.ENTITY_STATE_COLUMN_NAME,
-                                                                  getStateType(), false ) )
-                      .addTableElement( d.createTableConstraintDefinition(
-                          d.createUniqueConstraintBuilder()
-                           .setUniqueness( UniqueSpecification.PRIMARY_KEY )
-                           .addColumns( SQLs.ENTITY_IDENTITY_COLUMN_NAME )
-                           .createExpression() )
-                      ).createExpression()
-                 ).createExpression()
-            };
-        }
-
-        protected SQLStatement createSelectAllEntitiesStatement( SQLVendor vendor )
-        {
-            QueryFactory q = vendor.getQueryFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-
-            return q.simpleQueryBuilder()
-                    .select( SQLs.ENTITY_STATE_COLUMN_NAME )
-                    .from( t.tableName( schemaName, SQLs.TABLE_NAME ) )
-                    .createExpression();
-        }
-
-        protected SQLStatement createSelectEntityStatement( SQLVendor vendor )
-        {
-            QueryFactory q = vendor.getQueryFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-            BooleanFactory b = vendor.getBooleanFactory();
-            ColumnsFactory c = vendor.getColumnsFactory();
-            LiteralFactory l = vendor.getLiteralFactory();
-
-            return q.simpleQueryBuilder()
-                    .select( SQLs.ENTITY_STATE_COLUMN_NAME )
-                    .from( t.tableName( schemaName, SQLs.TABLE_NAME ) )
-                    .where( b.eq( c.colName( SQLs.ENTITY_IDENTITY_COLUMN_NAME ), l.param() ) )
-                    .createExpression();
-        }
-
-        protected SQLStatement createInsertEntityStatement( SQLVendor vendor )
-        {
-            ModificationFactory m = vendor.getModificationFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-            LiteralFactory l = vendor.getLiteralFactory();
-
-            return m.insert()
-                    .setTableName( t.tableName( schemaName, SQLs.TABLE_NAME ) )
-                    .setColumnSource( m.columnSourceByValues()
-                                       .addColumnNames( SQLs.ENTITY_IDENTITY_COLUMN_NAME,
-                                                        SQLs.ENTITY_STATE_COLUMN_NAME )
-                                       .addValues( l.param(),
-                                                   l.param() )
-                                       .createExpression()
-                    ).createExpression();
-        }
-
-        protected SQLStatement createUpdateEntityStatement( SQLVendor vendor )
-        {
-            ModificationFactory m = vendor.getModificationFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-            LiteralFactory l = vendor.getLiteralFactory();
-            BooleanFactory b = vendor.getBooleanFactory();
-            ColumnsFactory c = vendor.getColumnsFactory();
-
-            UpdateBySearchBuilder builder = m.updateBySearch().setTargetTable(
-                m.createTargetTable( t.tableName( schemaName, SQLs.TABLE_NAME ) )
-            ).addSetClauses(
-                m.setClause( SQLs.ENTITY_VERSION_COLUMN_NAME, m.updateSourceByExp( l.param() ) ),
-                m.setClause( SQLs.ENTITY_STATE_COLUMN_NAME, m.updateSourceByExp( l.param() ) )
-            );
-            builder.getWhereBuilder().reset(
-                b.eq( c.colName( SQLs.ENTITY_IDENTITY_COLUMN_NAME ), l.param() )
-            ).and(
-                b.eq( c.colName( SQLs.ENTITY_VERSION_COLUMN_NAME ), l.param() )
-            );
-            return builder.createExpression();
-        }
-
-        protected SQLStatement createRemoveEntityStatement( SQLVendor vendor )
-        {
-            ModificationFactory m = vendor.getModificationFactory();
-            TableReferenceFactory t = vendor.getTableReferenceFactory();
-            LiteralFactory l = vendor.getLiteralFactory();
-            BooleanFactory b = vendor.getBooleanFactory();
-            ColumnsFactory c = vendor.getColumnsFactory();
-
-            DeleteBySearchBuilder builder = m.deleteBySearch().setTargetTable(
-                m.createTargetTable( t.tableName( schemaName, SQLs.TABLE_NAME ) )
-            );
-            builder.getWhere().reset(
-                b.eq( c.colName( SQLs.ENTITY_IDENTITY_COLUMN_NAME ), l.param() )
-            );
-            return builder.createExpression();
-        }
-
-        protected SQLDataType getIDType()
-        {
-            return vendor.getDataTypeFactory().sqlVarChar( 64 );
-        }
-
-        protected SQLDataType getVersionType()
-        {
-            return vendor.getDataTypeFactory().sqlVarChar( 64 );
-        }
-
-        protected SQLDataType getStateType()
-        {
-            return vendor.getDataTypeFactory().sqlVarChar( 10000 );
-        }
-
-        @Override
-        public String[] buildSQLForSchemaCreation()
-        {
-            return schemaCreationSQLs;
-        }
-
-        @Override
-        public String[] buildSQLForIndexCreation()
-        {
-            return indexCreationSQLs;
-        }
-
-        @Override
-        public String buildSQLForSelectAllEntitiesStatement()
-        {
-            return selectAllEntitiesSQL;
-        }
-
-        @Override
-        public String buildSQLForSelectEntityStatement()
-        {
-            return selectEntitySQL;
-        }
-
-        @Override
-        public String buildSQLForInsertEntityStatement()
-        {
-            return insertEntitySQL;
-        }
-
-        @Override
-        public String buildSQLForUpdateEntityStatement()
-        {
-            return updateEntitySQL;
-        }
-
-        @Override
-        public String buildSQLForRemoveEntityStatement()
-        {
-            return removeEntitySQL;
-        }
-
-        @Override
-        public String[] buildSQLForTableCreation()
-        {
-            return tableCreationSQLs;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DerbySQLDatabaseSQLServiceMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DerbySQLDatabaseSQLServiceMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DerbySQLDatabaseSQLServiceMixin.java
deleted file mode 100644
index 083d79e..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/DerbySQLDatabaseSQLServiceMixin.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@SuppressWarnings( "ProtectedField" )
-public abstract class DerbySQLDatabaseSQLServiceMixin
-    implements DatabaseSQLService, DatabaseSQLStringsBuilder, DatabaseSQLServiceSpi
-{
-    private static final Logger LOGGER = LoggerFactory.getLogger( DerbySQLDatabaseSQLServiceMixin.class );
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    @Override
-    public boolean tableExists( Connection connection )
-        throws SQLException
-    {
-        ResultSet rs = null;
-        try
-        {
-            String tableNameForQuery = SQLs.TABLE_NAME.toUpperCase();
-            rs = connection.getMetaData().getTables( null, null, tableNameForQuery,
-                                                     new String[] { "TABLE" } );
-            boolean tableExists = rs.next();
-            LOGGER.trace( "Found table {}? {}", tableNameForQuery, tableExists );
-            return tableExists;
-        }
-        finally
-        {
-            SQLUtil.closeQuietly( rs );
-        }
-    }
-
-    @Override
-    public Reader getEntityStateReader( ResultSet rs )
-        throws SQLException
-    {
-        return new StringReader( rs.getString( SQLs.ENTITY_STATE_COLUMN_NAME ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/H2SQLDatabaseSQLServiceMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/H2SQLDatabaseSQLServiceMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/H2SQLDatabaseSQLServiceMixin.java
deleted file mode 100644
index 3b870c6..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/H2SQLDatabaseSQLServiceMixin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class H2SQLDatabaseSQLServiceMixin
-    implements DatabaseSQLService, DatabaseSQLStringsBuilder, DatabaseSQLServiceSpi
-{
-    private static final Logger LOGGER = LoggerFactory.getLogger( H2SQLDatabaseSQLServiceMixin.class );
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    public boolean tableExists( Connection connection )
-        throws SQLException
-    {
-        ResultSet rs = null;
-        try
-        {
-            String tableNameForQuery = SQLs.TABLE_NAME.toUpperCase();
-            rs = connection.getMetaData().getTables( null, null, tableNameForQuery,
-                                                     new String[] { "TABLE" } );
-            boolean tableExists = rs.next();
-            LOGGER.trace( "Found table {}? {}", tableNameForQuery, tableExists );
-            return tableExists;
-        }
-        finally
-        {
-            SQLUtil.closeQuietly( rs );
-        }
-    }
-
-    public Reader getEntityStateReader( ResultSet rs )
-        throws SQLException
-    {
-        return new StringReader( rs.getString( SQLs.ENTITY_STATE_COLUMN_NAME ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/MySQLDatabaseSQLServiceMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/MySQLDatabaseSQLServiceMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/MySQLDatabaseSQLServiceMixin.java
deleted file mode 100644
index 1c6c534..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/MySQLDatabaseSQLServiceMixin.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@SuppressWarnings( "ProtectedField" )
-public abstract class MySQLDatabaseSQLServiceMixin
-    implements DatabaseSQLService, DatabaseSQLStringsBuilder, DatabaseSQLServiceSpi
-{
-
-    private static final Logger LOGGER = LoggerFactory.getLogger( MySQLDatabaseSQLServiceMixin.class );
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    @Override
-    public boolean tableExists( Connection connection )
-        throws SQLException
-    {
-        ResultSet rs = null;
-        try
-        {
-            String tableNameForQuery = SQLs.TABLE_NAME.toUpperCase();
-            rs = connection.getMetaData().getTables( null, null, tableNameForQuery,
-                                                     new String[] { "TABLE" } );
-            boolean tableExists = rs.next();
-            LOGGER.trace( "Found table {}? {}", tableNameForQuery, tableExists );
-            return tableExists;
-        }
-        finally
-        {
-            SQLUtil.closeQuietly( rs );
-        }
-    }
-
-    @Override
-    public Reader getEntityStateReader( ResultSet rs )
-        throws SQLException
-    {
-        return new StringReader( rs.getString( SQLs.ENTITY_STATE_COLUMN_NAME ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLDatabaseSQLServiceMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLDatabaseSQLServiceMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLDatabaseSQLServiceMixin.java
deleted file mode 100644
index a4cf014..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLDatabaseSQLServiceMixin.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class PostgreSQLDatabaseSQLServiceMixin
-    implements DatabaseSQLServiceSpi, DatabaseSQLStringsBuilder, DatabaseSQLService
-{
-    private static final Logger LOGGER = LoggerFactory.getLogger( PostgreSQLDatabaseSQLServiceMixin.class );
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    @Override
-    public boolean tableExists( Connection connection )
-        throws SQLException
-    {
-        ResultSet rs = null;
-        try
-        {
-            rs = connection.getMetaData().getTables( null, spi.getCurrentSchemaName(), SQLs.TABLE_NAME,
-                                                     new String[] { "TABLE" } );
-            boolean tableExists = rs.next();
-            LOGGER.trace( "Found table {}? {}", SQLs.TABLE_NAME, tableExists );
-            return tableExists;
-        }
-        finally
-        {
-            SQLUtil.closeQuietly( rs );
-        }
-    }
-
-    @Override
-    public Reader getEntityStateReader( ResultSet rs )
-        throws SQLException
-    {
-        return rs.getCharacterStream( SQLs.ENTITY_STATE_COLUMN_NAME );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLStringBuilderMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLStringBuilderMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLStringBuilderMixin.java
deleted file mode 100644
index b43d1c7..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/PostgreSQLStringBuilderMixin.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-
-package org.apache.polygene.entitystore.sql.internal;
-
-import org.apache.polygene.entitystore.sql.internal.DatabaseSQLStringsBuilder.CommonMixin;
-import org.sql.generation.api.grammar.common.datatypes.SQLDataType;
-import org.sql.generation.api.vendor.PostgreSQLVendor;
-
-/**
- * 
- * @author Stanislav Muhametsin
- */
-public class PostgreSQLStringBuilderMixin extends CommonMixin
-{
-
-    @Override
-    protected SQLDataType getIDType()
-    {
-        return ((PostgreSQLVendor) this.getVendor()).getDataTypeFactory().text();
-    }
-
-    @Override
-    protected SQLDataType getStateType()
-    {
-        return ((PostgreSQLVendor) this.getVendor()).getDataTypeFactory().text();
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLEntityState.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLEntityState.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLEntityState.java
deleted file mode 100644
index 2db6f7c..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLEntityState.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.time.Instant;
-import java.util.Objects;
-import org.apache.polygene.api.common.QualifiedName;
-import org.apache.polygene.api.entity.EntityDescriptor;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.spi.entity.EntityState;
-import org.apache.polygene.spi.entity.EntityStatus;
-import org.apache.polygene.spi.entity.ManyAssociationState;
-import org.apache.polygene.spi.entity.NamedAssociationState;
-import org.apache.polygene.spi.entitystore.helpers.DefaultEntityState;
-
-public interface SQLEntityState
-        extends EntityState
-{
-
-    Long getEntityPK();
-
-    Long getEntityOptimisticLock();
-
-    DefaultEntityState getDefaultEntityState();
-
-    @SuppressWarnings( "PublicInnerClass" )
-    public final class DefaultSQLEntityState
-            implements SQLEntityState
-    {
-
-        private final DefaultEntityState state;
-
-        private final Long entityPK;
-
-        private final Long entityOptimisticLock;
-
-        public DefaultSQLEntityState( DefaultEntityState state )
-        {
-            Objects.requireNonNull( state, "Entity state" );
-            this.state = state;
-            this.entityPK = null;
-            this.entityOptimisticLock = null;
-        }
-
-        public DefaultSQLEntityState( DefaultEntityState state, Long entityPK, Long entityOptimisticLock )
-        {
-            Objects.requireNonNull( state, "Entity state" );
-            Objects.requireNonNull( entityPK, "Entity PK" );
-            Objects.requireNonNull( entityOptimisticLock, "Entity OptimisticLock" );
-            this.state = state;
-            this.entityPK = entityPK;
-            this.entityOptimisticLock = entityOptimisticLock;
-        }
-
-        @Override
-        public Long getEntityPK()
-        {
-            return entityPK;
-        }
-
-        @Override
-        public Long getEntityOptimisticLock()
-        {
-            return entityOptimisticLock;
-        }
-
-        @Override
-        public DefaultEntityState getDefaultEntityState()
-        {
-            return state;
-        }
-
-        @Override
-        public EntityDescriptor entityDescriptor()
-        {
-            return state.entityDescriptor();
-        }
-
-        @Override
-        public EntityReference associationValueOf( QualifiedName stateName )
-        {
-            return state.associationValueOf( stateName );
-        }
-
-        @Override
-        public ManyAssociationState manyAssociationValueOf( QualifiedName stateName )
-        {
-            return state.manyAssociationValueOf( stateName );
-        }
-
-        @Override
-        public NamedAssociationState namedAssociationValueOf( QualifiedName stateName )
-        {
-            return state.namedAssociationValueOf( stateName );
-        }
-
-        @Override
-        public Object propertyValueOf( QualifiedName stateName )
-        {
-            return state.propertyValueOf( stateName );
-        }
-
-        @Override
-        public EntityReference entityReference()
-        {
-            return state.entityReference();
-        }
-
-        @Override
-        public boolean isAssignableTo( Class<?> type )
-        {
-            return state.isAssignableTo( type );
-        }
-
-        @Override
-        public Instant lastModified()
-        {
-            return state.lastModified();
-        }
-
-        @Override
-        public void remove()
-        {
-            state.remove();
-        }
-
-        @Override
-        public void setAssociationValue( QualifiedName stateName, EntityReference newEntity )
-        {
-            state.setAssociationValue( stateName, newEntity );
-        }
-
-        @Override
-        public void setPropertyValue( QualifiedName stateName, Object json )
-        {
-            state.setPropertyValue( stateName, json );
-        }
-
-        @Override
-        public EntityStatus status()
-        {
-            return state.status();
-        }
-
-        @Override
-        public String version()
-        {
-            return state.version();
-        }
-
-        @Override
-        @SuppressWarnings( "EqualsWhichDoesntCheckParameterClass" )
-        public boolean equals( Object obj )
-        {
-            return state.equals( obj );
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return state.hashCode();
-        }
-
-        @Override
-        public String toString()
-        {
-            return state.toString();
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLiteDatabaseSQLServiceMixin.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLiteDatabaseSQLServiceMixin.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLiteDatabaseSQLServiceMixin.java
deleted file mode 100644
index d762f8b..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLiteDatabaseSQLServiceMixin.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import org.apache.polygene.api.injection.scope.This;
-import org.apache.polygene.library.sql.common.SQLUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class SQLiteDatabaseSQLServiceMixin
-    implements DatabaseSQLService, DatabaseSQLStringsBuilder, DatabaseSQLServiceSpi
-{
-    private static final Logger LOGGER = LoggerFactory.getLogger( SQLiteDatabaseSQLServiceMixin.class );
-
-    @This
-    protected DatabaseSQLServiceSpi spi;
-
-    @Override
-    public boolean tableExists( Connection connection )
-        throws SQLException
-    {
-        ResultSet rs = null;
-        try
-        {
-            String tableNameForQuery = SQLs.TABLE_NAME.toUpperCase();
-            rs = connection.getMetaData().getTables( null, null, tableNameForQuery,
-                                                     new String[] { "TABLE" } );
-            boolean tableExists = rs.next();
-            LOGGER.trace( "Found table {}? {}", tableNameForQuery, tableExists );
-            return tableExists;
-        }
-        finally
-        {
-            SQLUtil.closeQuietly( rs );
-        }
-    }
-
-    @Override
-    public Reader getEntityStateReader( ResultSet rs )
-        throws SQLException
-    {
-        return new StringReader( rs.getString( SQLs.ENTITY_STATE_COLUMN_NAME ) );
-    }
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLs.java
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLs.java b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLs.java
deleted file mode 100644
index 8555a5d..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/SQLs.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
- */
-package org.apache.polygene.entitystore.sql.internal;
-
-public interface SQLs
-{
-    String DEFAULT_SCHEMA_NAME = "POLYGENE_ES";
-    String TABLE_NAME = "POLYGENE_ENTITIES";
-    String ENTITY_IDENTITY_COLUMN_NAME = "ENTITY_IDENTITY";
-    String ENTITY_VERSION_COLUMN_NAME = "ENTITY_VERSION";
-    String ENTITY_STATE_COLUMN_NAME = "ENTITY_STATE";
-}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/package.html
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/package.html b/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/package.html
deleted file mode 100644
index 508f1fc..0000000
--- a/extensions/entitystore-sql/src/main/java/org/apache/polygene/entitystore/sql/internal/package.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!--
-  ~  Licensed to the Apache Software Foundation (ASF) under one
-  ~  or more contributor license agreements.  See the NOTICE file
-  ~  distributed with this work for additional information
-  ~  regarding copyright ownership.  The ASF licenses this file
-  ~  to you under the Apache License, Version 2.0 (the
-  ~  "License"); you may not use this file except in compliance
-  ~  with the License.  You may obtain a copy of the License at
-  ~
-  ~       http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~  Unless required by applicable law or agreed to in writing, software
-  ~  distributed under the License is distributed on an "AS IS" BASIS,
-  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~  See the License for the specific language governing permissions and
-  ~  limitations under the License.
-  ~
-  ~
-  -->
-<html>
-    <body>
-        <h2>SQL EntityStore Internal Package.</h2>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/57eea7b3/extensions/entitystore-sql/src/main/resources/org/apache/polygene/entitystore/sql/changelog.xml
----------------------------------------------------------------------
diff --git a/extensions/entitystore-sql/src/main/resources/org/apache/polygene/entitystore/sql/changelog.xml b/extensions/entitystore-sql/src/main/resources/org/apache/polygene/entitystore/sql/changelog.xml
new file mode 100644
index 0000000..47ef554
--- /dev/null
+++ b/extensions/entitystore-sql/src/main/resources/org/apache/polygene/entitystore/sql/changelog.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Licensed to the Apache Software Foundation (ASF) under one
+  ~  or more contributor license agreements.  See the NOTICE file
+  ~  distributed with this work for additional information
+  ~  regarding copyright ownership.  The ASF licenses this file
+  ~  to you under the Apache License, Version 2.0 (the
+  ~  "License"); you may not use this file except in compliance
+  ~  with the License.  You may obtain a copy of the License at
+  ~
+  ~       http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~  Unless required by applicable law or agreed to in writing, software
+  ~  distributed under the License is distributed on an "AS IS" BASIS,
+  ~  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~  See the License for the specific language governing permissions and
+  ~  limitations under the License.
+  -->
+<databaseChangeLog
+        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd"
+        objectQuotingStrategy="QUOTE_ALL_OBJECTS">
+    <changeSet id="0" author="paul">
+        <createTable tableName="${es-sql.table}">
+            <column name="ENTITY_IDENTITY" type="varchar(64)">
+                <constraints primaryKey="true" nullable="false"/>
+            </column>
+            <column name="ENTITY_VERSION" type="varchar(64)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="ENTITY_STATE" type="varchar(10240)">
+                <constraints nullable="false"/>
+            </column>
+        </createTable>
+    </changeSet>
+</databaseChangeLog>