Search in sources :

Example 1 with SQLVendor

use of org.sql.generation.api.vendor.SQLVendor in project qi4j-sdk by Qi4j.

the class AbstractSQLEntityStoreAssembler method assemble.

@Override
public final void assemble(ModuleAssembly module) throws AssemblyException {
    try {
        SQLVendor sqlVendor = this.getSQLVendor();
        if (sqlVendor == null) {
            throw new AssemblyException("SQL Vendor could not be determined.");
        }
        module.services(DatabaseSQLServiceComposite.class).withMixins(DatabaseSQLServiceCoreMixin.class, DatabaseSQLServiceSpi.CommonMixin.class, getDatabaseStringBuilderMixin(), DatabaseSQLServiceStatementsMixin.class, getDatabaseSQLServiceSpecializationMixin()).identifiedBy(hasIdentity() ? identity() : DEFAULT_ENTITYSTORE_IDENTITY).visibleIn(Visibility.module).setMetaInfo(sqlVendor);
    } catch (IOException ioe) {
        throw new AssemblyException(ioe);
    }
    module.services(SQLEntityStoreService.class, UuidIdentityGeneratorService.class).visibleIn(visibility());
    if (hasConfig()) {
        configModule().entities(SQLConfiguration.class).visibleIn(configVisibility());
    }
}
Also used : UuidIdentityGeneratorService(org.qi4j.spi.uuid.UuidIdentityGeneratorService) AssemblyException(org.qi4j.bootstrap.AssemblyException) DatabaseSQLServiceStatementsMixin(org.qi4j.entitystore.sql.internal.DatabaseSQLServiceStatementsMixin) SQLEntityStoreService(org.qi4j.entitystore.sql.SQLEntityStoreService) SQLVendor(org.sql.generation.api.vendor.SQLVendor) SQLConfiguration(org.qi4j.library.sql.common.SQLConfiguration) IOException(java.io.IOException) DatabaseSQLServiceCoreMixin(org.qi4j.entitystore.sql.internal.DatabaseSQLServiceCoreMixin)

Example 2 with SQLVendor

use of org.sql.generation.api.vendor.SQLVendor in project qi4j-sdk by Qi4j.

the class AbstractSQLStartup method appendColumnDefinitionsForProperty.

private void appendColumnDefinitionsForProperty(TableElementListBuilder builder, QNameInfo qNameInfo) {
    Type finalType = qNameInfo.getFinalType();
    if (finalType instanceof ParameterizedType) {
        finalType = ((ParameterizedType) finalType).getRawType();
    }
    Class<?> finalClass = (Class<?>) finalType;
    SQLDataType sqlType = null;
    String valueRefTableName = null;
    String valueRefTablePKColumnName = null;
    if (qNameInfo.isFinalTypePrimitive()) {
        if (this._customizableTypes.keySet().contains(finalClass) && qNameInfo.getPropertyDescriptor().accessor().isAnnotationPresent(SQLTypeInfo.class)) {
            sqlType = this._customizableTypes.get(finalClass).customizeType(finalClass, qNameInfo.getPropertyDescriptor().accessor().getAnnotation(SQLTypeInfo.class));
        } else if (Enum.class.isAssignableFrom(finalClass)) {
            // Enum - reference the lookup table
            sqlType = this._primitiveTypes.get(Integer.class);
            valueRefTableName = ENUM_LOOKUP_TABLE_NAME;
            valueRefTablePKColumnName = ENUM_LOOKUP_TABLE_PK_COLUMN_NAME;
        } else {
            // Primitive type, default sqlType
            sqlType = this._primitiveTypes.get(finalClass);
        }
        if (sqlType == null) {
            throw new InternalError("Could not find sql type for java type [" + finalType + "]");
        }
    } else {
        // Value composite - just need used class
        sqlType = this._primitiveTypes.get(Integer.class);
        valueRefTableName = USED_CLASSES_TABLE_NAME;
        valueRefTablePKColumnName = USED_CLASSES_TABLE_PK_COLUMN_NAME;
    }
    SQLVendor vendor = this._vendor;
    DefinitionFactory d = vendor.getDefinitionFactory();
    TableReferenceFactory t = vendor.getTableReferenceFactory();
    builder.addTableElement(d.createColumnDefinition(QNAME_TABLE_VALUE_COLUMN_NAME, sqlType, qNameInfo.getCollectionDepth() > 0)).addTableElement(d.createTableConstraintDefinition(d.createUniqueConstraintBuilder().setUniqueness(UniqueSpecification.PRIMARY_KEY).addColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).createExpression()));
    if (valueRefTableName != null && valueRefTablePKColumnName != null) {
        builder.addTableElement(d.createTableConstraintDefinition(d.createForeignKeyConstraintBuilder().addSourceColumns(QNAME_TABLE_VALUE_COLUMN_NAME).setTargetTableName(t.tableName(this._state.schemaName().get(), valueRefTableName)).addTargetColumns(valueRefTablePKColumnName).setOnUpdate(ReferentialAction.CASCADE).setOnDelete(ReferentialAction.RESTRICT).createExpression(), ConstraintCharacteristics.NOT_DEFERRABLE));
    }
}
Also used : SQLDataType(org.sql.generation.api.grammar.common.datatypes.SQLDataType) SQLTypeInfo(org.qi4j.index.sql.support.api.SQLTypeInfo) ParameterizedType(java.lang.reflect.ParameterizedType) BigInteger(java.math.BigInteger) TableReferenceFactory(org.sql.generation.api.grammar.factories.TableReferenceFactory) QNameType(org.qi4j.index.sql.support.common.QNameInfo.QNameType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) ObjectType(org.sql.generation.api.grammar.manipulation.ObjectType) SQLDataType(org.sql.generation.api.grammar.common.datatypes.SQLDataType) SQLVendor(org.sql.generation.api.vendor.SQLVendor) DefinitionFactory(org.sql.generation.api.grammar.factories.DefinitionFactory)

Example 3 with SQLVendor

use of org.sql.generation.api.vendor.SQLVendor in project qi4j-sdk by Qi4j.

the class AbstractSQLStartup method readAppMetadataFromDB.

private void readAppMetadataFromDB(Connection connection, Map<String, EntityDescriptor> entityDescriptors) throws SQLException {
    String schemaName = this._state.schemaName().get();
    Statement stmt = connection.createStatement();
    SQLVendor vendor = this._vendor;
    QueryFactory q = vendor.getQueryFactory();
    TableReferenceFactory t = vendor.getTableReferenceFactory();
    try {
        // @formatter:off
        q.simpleQueryBuilder().select(ENTITY_TYPES_TABLE_PK_COLUMN_NAME, ENTITY_TYPES_TABLE_TYPE_NAME_COLUMN_NAME).from(t.tableName(schemaName, ENTITY_TYPES_TABLE_NAME)).createExpression();
        ResultSet rs = stmt.executeQuery(vendor.toString(q.simpleQueryBuilder().select(ENTITY_TYPES_TABLE_PK_COLUMN_NAME, ENTITY_TYPES_TABLE_TYPE_NAME_COLUMN_NAME).from(t.tableName(schemaName, ENTITY_TYPES_TABLE_NAME)).createExpression()));
        long pk;
        try {
            while (rs.next()) {
                pk = rs.getInt(1);
                String entityTypeName = rs.getString(2);
                this._state.entityTypePKs().get().put(entityTypeName, (int) pk);
            //                    this._state.entityTypeInfos().get()
            //                        .put( entityTypeName, new EntityTypeInfo( entityDescriptors.get( entityTypeName ), (int) pk ) );
            }
        } finally {
            SQLUtil.closeQuietly(rs);
        }
        rs = stmt.executeQuery(vendor.toString(q.simpleQueryBuilder().select(USED_CLASSES_TABLE_PK_COLUMN_NAME, USED_CLASSES_TABLE_CLASS_NAME_COLUMN_NAME).from(t.tableName(schemaName, USED_CLASSES_TABLE_NAME)).createExpression()));
        try {
            while (rs.next()) {
                pk = rs.getInt(1);
                String descriptorTextualFormat = rs.getString(2);
                this._state.usedClassesPKs().get().put(stringToCompositeDescriptor(ValueDescriptor.class, this._app.descriptor(), descriptorTextualFormat), (int) pk);
            }
        } finally {
            SQLUtil.closeQuietly(rs);
        }
        rs = stmt.executeQuery(vendor.toString(q.simpleQueryBuilder().select(ENUM_LOOKUP_TABLE_PK_COLUMN_NAME, ENUM_LOOKUP_TABLE_ENUM_VALUE_NAME).from(t.tableName(schemaName, ENUM_LOOKUP_TABLE_NAME)).createExpression()));
        try {
            while (rs.next()) {
                pk = rs.getInt(1);
                String enumName = rs.getString(2);
                this._state.enumPKs().get().put(enumName, (int) pk);
            }
        } finally {
            SQLUtil.closeQuietly(rs);
        }
        rs = stmt.executeQuery(q.simpleQueryBuilder().select(USED_QNAMES_TABLE_QNAME_COLUMN_NAME, USED_QNAMES_TABLE_TABLE_NAME_COLUMN_NAME).from(t.tableName(schemaName, USED_QNAMES_TABLE_NAME)).createExpression().toString());
        try {
            while (rs.next()) {
                String qName = rs.getString(1);
                String tableName = rs.getString(2);
                this._state.qNameInfos().get().get(QualifiedName.fromFQN(qName)).setTableName(tableName);
            }
        } finally {
            SQLUtil.closeQuietly(rs);
        }
    // @formatter:on
    } finally {
        SQLUtil.closeQuietly(stmt);
    }
}
Also used : TableReferenceFactory(org.sql.generation.api.grammar.factories.TableReferenceFactory) QueryFactory(org.sql.generation.api.grammar.factories.QueryFactory) InsertStatement(org.sql.generation.api.grammar.modification.InsertStatement) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) ValueDescriptor(org.qi4j.api.value.ValueDescriptor) ResultSet(java.sql.ResultSet) SQLVendor(org.sql.generation.api.vendor.SQLVendor)

Example 4 with SQLVendor

use of org.sql.generation.api.vendor.SQLVendor in project qi4j-sdk by Qi4j.

the class AbstractSQLStartup method writeAppMetadataToDB.

private void writeAppMetadataToDB(Connection connection, ApplicationInfo appInfo, Map<String, Long> tablePKs) throws SQLException {
    String schemaName = this._state.schemaName().get();
    SQLVendor vendor = this._vendor;
    ModificationFactory m = vendor.getModificationFactory();
    TableReferenceFactory t = vendor.getTableReferenceFactory();
    LiteralFactory l = vendor.getLiteralFactory();
    // @formatter:off
    PreparedStatement ps = connection.prepareStatement(vendor.toString(m.insert().setTableName(t.tableName(schemaName, ENTITY_TYPES_TABLE_NAME)).setColumnSource(m.columnSourceByValues().addValues(l.param(), l.param()).createExpression()).createExpression()));
    try {
        Set<String> insertedTypeNames = new HashSet<>();
        for (EntityDescriptor descriptor : appInfo.entityDescriptors.values()) {
            for (Class<?> entityType : descriptor.types()) {
                String entityTypeName = entityType.getName();
                if (!insertedTypeNames.contains(entityTypeName)) {
                    long pk = tablePKs.get(ENTITY_TYPES_TABLE_NAME);
                    ps.setInt(1, (int) pk);
                    ps.setString(2, entityTypeName);
                    ps.executeUpdate();
                    this._state.entityTypePKs().get().put(entityTypeName, (int) pk);
                    //                      this._state.entityTypeInfos().get().put( entityTypeName, new EntityTypeInfo( descriptor, (int) pk ) );
                    tablePKs.put(ENTITY_TYPES_TABLE_NAME, pk + 1);
                }
            }
        }
    } finally {
        SQLUtil.closeQuietly(ps);
    }
    ps = connection.prepareStatement(vendor.toString(m.insert().setTableName(t.tableName(schemaName, USED_CLASSES_TABLE_NAME)).setColumnSource(m.columnSourceByValues().addValues(l.param(), l.param()).createExpression()).createExpression()));
    try {
        for (CompositeDescriptorInfo descInfo : appInfo.usedValueComposites) {
            String vDescStr = compositeDescriptorToString(descInfo.layer, descInfo.module, descInfo.composite);
            long pk = tablePKs.get(USED_CLASSES_TABLE_NAME);
            ps.setInt(1, (int) pk);
            ps.setString(2, vDescStr);
            ps.executeUpdate();
            this._state.usedClassesPKs().get().put(descInfo.composite, (int) pk);
            tablePKs.put(USED_CLASSES_TABLE_NAME, pk + 1);
        }
    } finally {
        SQLUtil.closeQuietly(ps);
    }
    ps = connection.prepareStatement(vendor.toString(m.insert().setTableName(t.tableName(schemaName, ENUM_LOOKUP_TABLE_NAME)).setColumnSource(m.columnSourceByValues().addValues(l.param(), l.param()).createExpression()).createExpression()));
    try {
        for (String enumValue : appInfo.enumValues) {
            long pk = tablePKs.get(ENUM_LOOKUP_TABLE_NAME);
            ps.setInt(1, (int) pk);
            ps.setString(2, enumValue);
            ps.executeUpdate();
            this._state.enumPKs().get().put(enumValue, (int) pk);
            tablePKs.put(ENUM_LOOKUP_TABLE_NAME, pk + 1);
        }
    } finally {
        SQLUtil.closeQuietly(ps);
    }
    Statement stmt = connection.createStatement();
    ps = connection.prepareStatement(this.createInsertStatementForQNameInfo(connection, schemaName, vendor).toString());
    try {
        DefinitionFactory d = vendor.getDefinitionFactory();
        for (QNameInfo qNameInfo : this._state.qNameInfos().get().values()) {
            QNameType type = qNameInfo.getQNameType();
            TableElementListBuilder builder = d.createTableElementListBuilder();
            builder.addTableElement(d.createColumnDefinition(ALL_QNAMES_TABLE_PK_COLUMN_NAME, this._primitiveTypes.get(Integer.class), false)).addTableElement(d.createColumnDefinition(ENTITY_TABLE_PK_COLUMN_NAME, this._primitiveTypes.get(ENTITY_PK_TYPE), false));
            if (type.equals(QNameType.PROPERTY)) {
                builder.addTableElement(d.createColumnDefinition(QNAME_TABLE_PARENT_QNAME_COLUMN_NAME, this._primitiveTypes.get(Integer.class), true));
                if (qNameInfo.getCollectionDepth() > 0) {
                    builder.addTableElement(d.createColumnDefinition(QNAME_TABLE_COLLECTION_PATH_COLUMN_NAME, this.getCollectionPathDataType(), false));
                }
                this.appendColumnDefinitionsForProperty(builder, qNameInfo);
                builder.addTableElement(d.createTableConstraintDefinition(d.createForeignKeyConstraintBuilder().addSourceColumns(QNAME_TABLE_PARENT_QNAME_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).setTargetTableName(t.tableName(schemaName, ALL_QNAMES_TABLE_NAME)).addTargetColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).setOnUpdate(ReferentialAction.CASCADE).setOnDelete(ReferentialAction.CASCADE).createExpression(), ConstraintCharacteristics.INITIALLY_DEFERRED_DEFERRABLE));
            } else {
                if (type.equals(QNameType.ASSOCIATION)) {
                    builder.addTableElement(d.createColumnDefinition(QNAME_TABLE_VALUE_COLUMN_NAME, this._primitiveTypes.get(ENTITY_PK_TYPE), false)).addTableElement(d.createTableConstraintDefinition(d.createUniqueConstraintBuilder().setUniqueness(UniqueSpecification.PRIMARY_KEY).addColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).createExpression()));
                } else if (type.equals(QNameType.MANY_ASSOCIATION)) {
                    builder.addTableElement(d.createColumnDefinition(QNAME_TABLE_ASSOCIATION_INDEX_COLUMN_NAME, this._primitiveTypes.get(Integer.class), false)).addTableElement(d.createColumnDefinition(QNAME_TABLE_VALUE_COLUMN_NAME, this._primitiveTypes.get(ENTITY_PK_TYPE), false)).addTableElement(d.createTableConstraintDefinition(d.createUniqueConstraintBuilder().setUniqueness(UniqueSpecification.PRIMARY_KEY).addColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).createExpression()));
                } else {
                    throw new IllegalArgumentException("Did not how to create table for qName type: " + type + ".");
                }
                builder.addTableElement(d.createTableConstraintDefinition(d.createForeignKeyConstraintBuilder().addSourceColumns(QNAME_TABLE_VALUE_COLUMN_NAME).setTargetTableName(t.tableName(schemaName, ENTITY_TABLE_NAME)).addTargetColumns(ENTITY_TABLE_PK_COLUMN_NAME).setOnUpdate(ReferentialAction.CASCADE).setOnDelete(ReferentialAction.CASCADE).createExpression(), ConstraintCharacteristics.INITIALLY_DEFERRED_DEFERRABLE));
                tablePKs.put(qNameInfo.getTableName(), 0L);
            }
            builder.addTableElement(d.createTableConstraintDefinition(d.createForeignKeyConstraintBuilder().addSourceColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).setTargetTableName(t.tableName(schemaName, ALL_QNAMES_TABLE_NAME)).addTargetColumns(ALL_QNAMES_TABLE_PK_COLUMN_NAME, ENTITY_TABLE_PK_COLUMN_NAME).setOnUpdate(ReferentialAction.CASCADE).setOnDelete(ReferentialAction.CASCADE).createExpression(), ConstraintCharacteristics.INITIALLY_DEFERRED_DEFERRABLE));
            stmt.execute(this._vendor.toString(d.createTableDefinitionBuilder().setTableName(t.tableName(schemaName, qNameInfo.getTableName())).setTableContentsSource(builder.createExpression()).createExpression()));
            //                stmt.execute( "COMMENT ON TABLE " + schemaName + "." + qNameInfo.getTableName() + " IS '"
            //                    + qNameInfo.getQName() + "'" );
            ps.setString(1, qNameInfo.getQName().toString());
            ps.setString(2, qNameInfo.getTableName());
            ps.execute();
        }
    } finally {
        SQLUtil.closeQuietly(stmt);
        SQLUtil.closeQuietly(ps);
    }
// @formatter:off
}
Also used : QNameType(org.qi4j.index.sql.support.common.QNameInfo.QNameType) InsertStatement(org.sql.generation.api.grammar.modification.InsertStatement) PreparedStatement(java.sql.PreparedStatement) Statement(java.sql.Statement) TableElementListBuilder(org.sql.generation.api.grammar.builders.definition.TableElementListBuilder) PreparedStatement(java.sql.PreparedStatement) LiteralFactory(org.sql.generation.api.grammar.factories.LiteralFactory) BigInteger(java.math.BigInteger) ModificationFactory(org.sql.generation.api.grammar.factories.ModificationFactory) TableReferenceFactory(org.sql.generation.api.grammar.factories.TableReferenceFactory) EntityDescriptor(org.qi4j.api.entity.EntityDescriptor) SQLVendor(org.sql.generation.api.vendor.SQLVendor) QNameInfo(org.qi4j.index.sql.support.common.QNameInfo) DefinitionFactory(org.sql.generation.api.grammar.factories.DefinitionFactory) HashSet(java.util.HashSet)

Example 5 with SQLVendor

use of org.sql.generation.api.vendor.SQLVendor in project qi4j-sdk by Qi4j.

the class AbstractSQLIndexQueryAssembler method assemble.

@Override
public final void assemble(ModuleAssembly module) throws AssemblyException {
    try {
        SQLVendor sqlVendor = getSQLVendor();
        if (sqlVendor == null) {
            throw new AssemblyException("SQL Vendor could not be determined.");
        }
        module.services(getIndexQueryServiceType()).identifiedBy(identity()).setMetaInfo(sqlVendor).visibleIn(visibility()).instantiateOnStartup();
    } catch (IOException ex) {
        throw new AssemblyException("SQL Vendor could not be created", ex);
    }
    module.services(ReindexerService.class).visibleIn(Visibility.module);
    module.services(ReindexingStrategy.class).withMixins(reindexingStrategy).visibleIn(Visibility.module);
    if (hasConfig()) {
        configModule().entities(SQLConfiguration.class, ReindexerConfiguration.class).visibleIn(configVisibility());
    }
}
Also used : AssemblyException(org.qi4j.bootstrap.AssemblyException) ReindexerService(org.qi4j.index.reindexer.ReindexerService) ReindexerConfiguration(org.qi4j.index.reindexer.ReindexerConfiguration) SQLVendor(org.sql.generation.api.vendor.SQLVendor) SQLConfiguration(org.qi4j.library.sql.common.SQLConfiguration) IOException(java.io.IOException)

Aggregations

SQLVendor (org.sql.generation.api.vendor.SQLVendor)9 TableReferenceFactory (org.sql.generation.api.grammar.factories.TableReferenceFactory)5 PreparedStatement (java.sql.PreparedStatement)4 BigInteger (java.math.BigInteger)3 ResultSet (java.sql.ResultSet)3 Statement (java.sql.Statement)3 DefinitionFactory (org.sql.generation.api.grammar.factories.DefinitionFactory)3 QueryFactory (org.sql.generation.api.grammar.factories.QueryFactory)3 InsertStatement (org.sql.generation.api.grammar.modification.InsertStatement)3 IOException (java.io.IOException)2 AssemblyException (org.qi4j.bootstrap.AssemblyException)2 QNameType (org.qi4j.index.sql.support.common.QNameInfo.QNameType)2 SQLConfiguration (org.qi4j.library.sql.common.SQLConfiguration)2 LiteralFactory (org.sql.generation.api.grammar.factories.LiteralFactory)2 ModificationFactory (org.sql.generation.api.grammar.factories.ModificationFactory)2 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 Connection (java.sql.Connection)1 SQLException (java.sql.SQLException)1 Date (java.util.Date)1