Examples of RDBMSStoreManager


Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        String tableGroupName = sourceSqlTbl.getGroupName() + "." + mmd.getName();
        JavaTypeMapping m = sourceSqlTbl.getTable().getMemberMapping(mmd);
        if (m != null && m.includeInFetchStatement())
        {
            int relationType = mmd.getRelationType(clr);
            RDBMSStoreManager storeMgr = stmt.getRDBMSManager();
            RDBMSAdapter dba = (RDBMSAdapter) storeMgr.getDatastoreAdapter();
            if (!dba.validToSelectMappingInStatement(stmt, m))
            {
                // Not valid to select this mapping for this statement so return
                return;
            }

            MetaDataManager mmgr = storeMgr.getMetaDataManager();
            StatementMappingIndex stmtMapping = new StatementMappingIndex(m);
            if (m.getNumberOfDatastoreMappings() > 0)
            {
                // Select of fields with columns in source table(s)
                // Adds inner/outer join to any required superclass/secondary tables
                SQLTable sqlTbl = SQLStatementHelper.getSQLTableForMappingOfTable(stmt, sourceSqlTbl, m);

                boolean selectFK = true;
                if (selectSubobjects && (relationType == Relation.ONE_TO_ONE_UNI ||
                    (relationType == Relation.ONE_TO_ONE_BI && mmd.getMappedBy() == null)) &&
                    !mmd.isSerialized() && !mmd.isEmbedded())
                {
                    // Related object with FK at this side
                    if (mmd.fetchFKOnly())
                    {
                        // Only want FK fetching, and not the fields of the object (so avoid the join)
                    }
                    else
                    {
                        // select fetch plan fields of this object
                        AbstractClassMetaData relatedCmd =
                            storeMgr.getMetaDataManager().getMetaDataForClass(mmd.getType(), clr);
                        if (relatedCmd != null)
                        {
                            // Find the table of the related class
                            DatastoreClass relatedTbl = storeMgr.getDatastoreClass(relatedCmd.getFullClassName(), clr);
                            if (relatedTbl == null)
                            {
                                // Class doesn't have its own table (subclass-table) so find where it persists
                                AbstractClassMetaData[] ownerParentCmds =
                                    storeMgr.getClassesManagingTableForClass(relatedCmd, clr);
                                if (ownerParentCmds.length > 1)
                                {
                                    throw new NucleusUserException("Relation (" + mmd.getFullFieldName() +
                                    ") with multiple related tables (using subclass-table). Not supported");
                                }

                                relatedTbl = storeMgr.getDatastoreClass(ownerParentCmds[0].getFullClassName(), clr);
                            }

                            String requiredGroupName = null;
                            if (sourceSqlTbl.getGroupName() != null)
                            {
                                // JPQL will have table groups defined already, named as per "alias.fieldName"
                                requiredGroupName = sourceSqlTbl.getGroupName() + "." + mmd.getName();
                            }
                            SQLTable relatedSqlTbl = stmt.getTable(relatedTbl, requiredGroupName);
                            if (relatedSqlTbl == null)
                            {
                                // Join the 1-1 relation
                                relatedSqlTbl = addJoinForOneToOneRelation(stmt,
                                    m, sqlTbl, relatedTbl.getIdMapping(), relatedTbl, null, null, tableGroupName, null);
                            }

                            StatementClassMapping subMappingDefinition =
                                new StatementClassMapping(mmd.getClassName(), mmd.getName());
                            selectFetchPlanOfSourceClassInStatement(stmt, subMappingDefinition, fetchPlan,
                                relatedSqlTbl, relatedCmd, maxFetchPlanLimit-1);
                            if (mappingDefinition != null)
                            {
                                if (relatedCmd.getIdentityType() == IdentityType.APPLICATION)
                                {
                                    int[] pkFields = relatedCmd.getPKMemberPositions();
                                    int[] pkCols = new int[m.getNumberOfDatastoreMappings()];
                                    int pkColNo = 0;
                                    for (int i=0;i<pkFields.length;i++)
                                    {
                                        StatementMappingIndex pkIdx = subMappingDefinition.getMappingForMemberPosition(pkFields[i]);
                                        int[] pkColNumbers = pkIdx.getColumnPositions();
                                        for (int j=0;j<pkColNumbers.length;j++)
                                        {
                                            pkCols[pkColNo] = pkColNumbers[j];
                                            pkColNo++;
                                        }
                                    }
                                    selectFK = false;
                                    stmtMapping.setColumnPositions(pkCols);
                                }
                                else if (relatedCmd.getIdentityType() == IdentityType.DATASTORE)
                                {
                                    StatementMappingIndex pkIdx = subMappingDefinition.getMappingForMemberPosition(StatementClassMapping.MEMBER_DATASTORE_ID);
                                    selectFK = false;
                                    stmtMapping.setColumnPositions(pkIdx.getColumnPositions());
                                }
                                mappingDefinition.addMappingDefinitionForMember(mmd.getAbsoluteFieldNumber(),
                                    subMappingDefinition);
                            }
                        }
                        else
                        {
                            // TODO 1-1 interface relation
                        }
                    }
                }
                if (selectFK)
                {
                    int[] colNumbers = stmt.select(sqlTbl, m, null);
                    stmtMapping.setColumnPositions(colNumbers);
                }
            }
            else
            {
                // Select of related objects with FK in other table
                if (relationType == Relation.ONE_TO_ONE_BI && mmd.getMappedBy() != null)
                {
                    // 1-1 bidirectional relation with FK in related table
                    AbstractMemberMetaData[] relatedMmds = mmd.getRelatedMemberMetaData(clr);
                    AbstractMemberMetaData relatedMmd = relatedMmds[0];
                    String[] clsNames = null;
                    if (mmd.getType().isInterface())
                    {
                        if (mmd.getFieldTypes() != null && mmd.getFieldTypes().length == 1)
                        {
                            // Use field-type since only one class specified
                            Class fldTypeCls = clr.classForName(mmd.getFieldTypes()[0]);
                            if (fldTypeCls.isInterface())
                            {
                                // User has specified an interface, so find its implementations
                                clsNames = mmgr.getClassesImplementingInterface(mmd.getFieldTypes()[0], clr);
                            }
                            else
                            {
                                // Use user-provided field-type
                                clsNames = new String[] {mmd.getFieldTypes()[0]};
                            }
                        }
                        if (clsNames == null)
                        {
                            clsNames = mmgr.getClassesImplementingInterface(mmd.getTypeName(), clr);
                        }
                    }
                    else
                    {
                        clsNames = new String[] { mmd.getTypeName() };
                    }

                    DatastoreClass relatedTbl = storeMgr.getDatastoreClass(clsNames[0], clr);
                    JavaTypeMapping relatedMapping = relatedTbl.getMemberMapping(relatedMmd);
                    JavaTypeMapping relatedDiscrimMapping = relatedTbl.getDiscriminatorMapping(true);
                    Object[] discrimValues = null;
                    JavaTypeMapping relatedTypeMapping = null;
                    AbstractClassMetaData relatedCmd = relatedMmd.getAbstractClassMetaData();
                    if (relatedDiscrimMapping != null &&
                        (relatedCmd.getSuperAbstractClassMetaData() != null || !relatedCmd.getFullClassName().equals(mmd.getTypeName())))
                    {
                        // Related table has a discriminator and the field can store other types
                        List discValueList = null;
                        for (int i=0;i<clsNames.length;i++)
                        {
                            List values = getDiscriminatorValuesForMember(clsNames[i],
                                relatedDiscrimMapping, storeMgr, clr);
                            if (discValueList == null)
                            {
                                discValueList = values;
                            }
                            else
                            {
                                discValueList.addAll(values);
                            }
                        }
                        discrimValues = discValueList.toArray(new Object[discValueList.size()]);
                    }
                    else if (relatedTbl != relatedMapping.getDatastoreContainer())
                    {
                        // The relation is to a base class table, and the type stored is a sub-class
                        relatedTypeMapping = relatedTbl.getIdMapping();
                    }

                    SQLTable relatedSqlTbl = null;
                    if (relatedTypeMapping == null)
                    {
                        // Join the 1-1 relation
                        relatedSqlTbl = addJoinForOneToOneRelation(stmt,
                            sourceSqlTbl.getTable().getIdMapping(), sourceSqlTbl,
                            relatedMapping, relatedTbl, null, discrimValues, tableGroupName, null);

                        // Select the id mapping in the related table
                        int[] colNumbers = stmt.select(relatedSqlTbl, relatedTbl.getIdMapping(), null);
                        stmtMapping.setColumnPositions(colNumbers);
                    }
                    else
                    {
                        DatastoreClass relationTbl = (DatastoreClass)relatedMapping.getDatastoreContainer();
                        if (relatedTbl != relatedMapping.getDatastoreContainer())
                        {
                            if (relatedMapping.isNullable())
                            {
                                // Nullable - left outer join from {sourceTable}.ID to {relatedBaseTable}.FK
                                // and inner join from {relatedBaseTable}.ID to {relatedTable}.ID
                                // (joins the relation and restricts to the right type)
                                relatedSqlTbl = stmt.leftOuterJoin(sourceSqlTbl,
                                    sourceSqlTbl.getTable().getIdMapping(),
                                    relatedMapping.getDatastoreContainer(), null, relatedMapping, null, tableGroupName);
                                relatedSqlTbl = stmt.innerJoin(relatedSqlTbl,
                                    relatedMapping.getDatastoreContainer().getIdMapping(),
                                    relatedTbl, null, relatedTbl.getIdMapping(), null, tableGroupName);
                            }
                            else
                            {
                                // Not nullable - inner join from {sourceTable}.ID to {relatedBaseTable}.FK
                                // and inner join from {relatedBaseTable}.ID to {relatedTable}.ID
                                // (joins the relation and restricts to the right type)
                                relatedSqlTbl = stmt.innerJoin(sourceSqlTbl,
                                    sourceSqlTbl.getTable().getIdMapping(),
                                    relatedMapping.getDatastoreContainer(), null, relatedMapping, null, tableGroupName);
                                relatedSqlTbl = stmt.innerJoin(relatedSqlTbl,
                                    relatedMapping.getDatastoreContainer().getIdMapping(),
                                    relatedTbl, null, relatedTbl.getIdMapping(), null, tableGroupName);
                            }
                        }
                        else
                        {
                            // Join the 1-1 relation
                            relatedSqlTbl = addJoinForOneToOneRelation(stmt,
                                sourceSqlTbl.getTable().getIdMapping(), sourceSqlTbl,
                                relatedMapping, relationTbl, null, null, tableGroupName, null);
                        }

                        // Select the id mapping in the subclass of the related table
                        // Note this adds an inner join from relatedTable to its subclass
                        relatedSqlTbl = SQLStatementHelper.getSQLTableForMappingOfTable(stmt, relatedSqlTbl,
                            relatedTbl.getIdMapping());
                        int[] colNumbers = stmt.select(relatedSqlTbl, relatedTbl.getIdMapping(), null);
                        stmtMapping.setColumnPositions(colNumbers);
                    }

                    if (selectSubobjects && !mmd.isSerialized() && !mmd.isEmbedded())
                    {
                        // Select the fetch-plan fields of the related object
                        StatementClassMapping subMappingDefinition = new StatementClassMapping(mmd.getName());
                        selectFetchPlanOfSourceClassInStatement(stmt, subMappingDefinition, fetchPlan,
                            relatedSqlTbl, relatedMmd.getAbstractClassMetaData(), maxFetchPlanLimit-1);
                        if (mappingDefinition != null)
                        {
                            mappingDefinition.addMappingDefinitionForMember(mmd.getAbsoluteFieldNumber(),
                                subMappingDefinition);
                        }
                    }
                }
                else if (relationType == Relation.MANY_TO_ONE_BI)
                {
                    AbstractMemberMetaData[] relatedMmds = mmd.getRelatedMemberMetaData(clr);
                    if (mmd.getJoinMetaData() != null || relatedMmds[0].getJoinMetaData() != null)
                    {
                        // N-1 bidirectional join table relation
                        // Add left outer join from {sourceTable}.ID to {joinTable}.ELEM_FK
                        DatastoreContainerObject joinTable =
                            storeMgr.getDatastoreContainerObject(relatedMmds[0]);
                        DatastoreElementContainer collTable = (DatastoreElementContainer)joinTable;
                        JavaTypeMapping selectMapping = collTable.getOwnerMapping();
                        SQLTable joinSqlTbl = null;
                        if (stmt.getPrimaryTable().getTable() != joinTable)
                        {
                            // Join to the join table
                            JavaTypeMapping referenceMapping = collTable.getElementMapping();
                            joinSqlTbl = stmt.leftOuterJoin(sourceSqlTbl,
                                sourceSqlTbl.getTable().getIdMapping(),
                                collTable, null, referenceMapping, null, tableGroupName);
                        }
                        else
                        {
                            // Main table of the statement is the join table so no need to join
                            joinSqlTbl = stmt.getPrimaryTable();
                        }

                        // Select the owner mapping of the join table
                        int[] colNumbers = stmt.select(joinSqlTbl, selectMapping, null);
                        stmtMapping.setColumnPositions(colNumbers);
                    }
                    // TODO Select fetch plan fields of this related object
                }
                else if (relationType == Relation.MANY_TO_ONE_UNI)
                {
                    // Add left outer join from {sourceTable}.ID to {joinTable}.OWNER_FK
                    PersistableJoinTable joinTable = (PersistableJoinTable) storeMgr.getDatastoreContainerObject(mmd);
                    SQLTable joinSqlTbl = stmt.leftOuterJoin(sourceSqlTbl,
                        sourceSqlTbl.getTable().getIdMapping(),
                        joinTable, null, joinTable.getOwnerMapping(), null, tableGroupName);

                    int[] colNumbers = stmt.select(joinSqlTbl, joinTable.getRelatedMapping(), null);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        if (type == BULK_DELETE || type == BULK_UPDATE)
        {
            // Update/Delete statement (INSERT/UPDATE/DELETE/MERGE)
            try
            {
                RDBMSStoreManager storeMgr = (RDBMSStoreManager)ec.getStoreManager();
                ManagedConnection mconn = storeMgr.getConnection(ec);
                SQLController sqlControl = storeMgr.getSQLController();

                try
                {
                    PreparedStatement ps = sqlControl.getStatementForUpdate(mconn, compiledSQL, false);
                    try
                    {
                        // Set the values of any parameters
                        for (int i=0;i<parameters.size();i++)
                        {
                            Object obj = parameters.get(Integer.valueOf(i+1));
                            ps.setObject((i+1), obj);
                        }

                        // Execute the update statement
                        int[] rcs = sqlControl.executeStatementUpdate(mconn, compiledSQL, ps, true);
                        return Long.valueOf(rcs[0]); // Return a single Long with the number of records updated
                    }
                    finally
                    {
                        sqlControl.closeStatement(mconn, ps);
                    }
                }
                finally
                {
                    mconn.release();
                }
            }
            catch (SQLException e)
            {
                throw new NucleusDataStoreException(LOCALISER.msg("059025", compiledSQL), e);
            }
        }
        else
        {
            // Query statement (SELECT, stored-procedure)
            QueryResult qr = null;
            try
            {
                RDBMSStoreManager storeMgr = (RDBMSStoreManager)ec.getStoreManager();
                ManagedConnection mconn = storeMgr.getConnection(ec);
                SQLController sqlControl = storeMgr.getSQLController();

                try
                {
                    PreparedStatement ps = RDBMSQueryUtils.getPreparedStatementForQuery(mconn, compiledSQL, this);
                    try
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        {
            // No range specified so don't apply checks!
            return false;
        }

        RDBMSStoreManager storeMgr = (RDBMSStoreManager)query.getStoreManager();
        RDBMSAdapter dba = (RDBMSAdapter)storeMgr.getDatastoreAdapter();
        long rangeFromIncl = query.getRangeFromIncl();
        long rangeToExcl   = query.getRangeToExcl();
        boolean using_limit_where_clause = (dba.getRangeByLimitEndOfStatementClause(rangeFromIncl, rangeToExcl).length() > 0);
        boolean using_rownum = (dba.getRangeByRowNumberColumn().length() > 0);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        boolean keyExists = false;
        ExecutionContext ec = sm.getExecutionContext();

        try
        {
            RDBMSStoreManager rdbmsMgr = (RDBMSStoreManager)storeMgr;
            ManagedConnection mconn = rdbmsMgr.getConnection(ec);
            SQLController sqlControl = rdbmsMgr.getSQLController();

            try
            {
                PreparedStatement ps = sqlControl.getStatementForQuery(mconn, findKeyStmt);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

    {
        SQLStatement sqlStmt = null;

        final ClassLoaderResolver clr = ownerSM.getExecutionContext().getClassLoaderResolver();
        final Class valueCls = clr.classForName(elementType);
        RDBMSStoreManager storeMgr = (RDBMSStoreManager)this.storeMgr;
        SQLTable containerSqlTbl = null;
        MapType mapType = getOwnerMemberMetaData().getMap().getMapType();
        if (emd != null && emd.getDiscriminatorStrategyForTable() != null &&
            emd.getDiscriminatorStrategyForTable() != DiscriminatorStrategy.NONE)
        {
            // Map<?, PC> where value has discriminator
            if (ClassUtils.isReferenceType(valueCls))
            {
                // Take the metadata for the first implementation of the reference type
                String[] clsNames = storeMgr.getNucleusContext().getMetaDataManager().getClassesImplementingInterface(elementType, clr);
                Class[] cls = new Class[clsNames.length];
                for (int j=0; j<clsNames.length; j++)
                {
                    cls[j] = clr.classForName(clsNames[j]);
                }
                StatementGenerator stmtGen = new DiscriminatorStatementGenerator(storeMgr, clr, cls, true, null, null);
                sqlStmt = stmtGen.getStatement();
            }
            else
            {
                StatementGenerator stmtGen = new DiscriminatorStatementGenerator(storeMgr, clr, valueCls, true, null, null);
                sqlStmt = stmtGen.getStatement();
            }
            iterateUsingDiscriminator = true;

            if (mapType == MapType.MAP_TYPE_VALUE_IN_KEY)
            {
                // Join to key table and select value fields
                JavaTypeMapping valueIdMapping = sqlStmt.getPrimaryTable().getTable().getIdMapping();
                containerSqlTbl = sqlStmt.innerJoin(sqlStmt.getPrimaryTable(), valueIdMapping,
                    containerTable, null, elementMapping, null, null);

                iteratorMappingDef = new StatementClassMapping();
                SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                    ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
            }
            else if (mapType == MapType.MAP_TYPE_KEY_IN_VALUE)
            {
                // Select value fields
                containerSqlTbl = sqlStmt.getPrimaryTable();

                iteratorMappingDef = new StatementClassMapping();
                SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                    ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
            }
            else
            {
                // Join to join table and select value fields
                JavaTypeMapping valueIdMapping = sqlStmt.getPrimaryTable().getTable().getIdMapping();
                containerSqlTbl = sqlStmt.innerJoin(sqlStmt.getPrimaryTable(), valueIdMapping,
                    containerTable, null, elementMapping, null, null);

                iteratorMappingDef = new StatementClassMapping();
                SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                    ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
            }
        }
        else
        {
            if (mapType == MapType.MAP_TYPE_VALUE_IN_KEY)
            {
                if (emd != null)
                {
                    // TODO Allow for null value [change to select the key table and left outer join to the key]
                    // Select of value table, joining to key table
                    iteratorMappingDef = new StatementClassMapping();
                    UnionStatementGenerator stmtGen = new UnionStatementGenerator(storeMgr, clr, valueCls, true, null, null);
                    stmtGen.setOption(StatementGenerator.OPTION_SELECT_NUCLEUS_TYPE);
                    iteratorMappingDef.setNucleusTypeColumnName(UnionStatementGenerator.NUC_TYPE_COLUMN);
                    sqlStmt = stmtGen.getStatement();

                    JavaTypeMapping valueIdMapping = sqlStmt.getPrimaryTable().getTable().getIdMapping();
                    containerSqlTbl = sqlStmt.innerJoin(sqlStmt.getPrimaryTable(), valueIdMapping,
                        containerTable, null, elementMapping, null, null);

                    SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                        ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
                }
                else
                {
                    // Select of value in key table
                    sqlStmt = new SQLStatement(storeMgr, containerTable, null, null);
                    sqlStmt.setClassLoaderResolver(clr);
                    containerSqlTbl = sqlStmt.getPrimaryTable();
                    sqlStmt.select(sqlStmt.getPrimaryTable(), elementMapping, null);
                }
            }
            else if (mapType == MapType.MAP_TYPE_KEY_IN_VALUE)
            {
                // Select of value in value table (allow union of possible value types)
                iteratorMappingDef = new StatementClassMapping();
                UnionStatementGenerator stmtGen = new UnionStatementGenerator(storeMgr, clr, valueCls, true, null, null);
                stmtGen.setOption(StatementGenerator.OPTION_SELECT_NUCLEUS_TYPE);
                iteratorMappingDef.setNucleusTypeColumnName(UnionStatementGenerator.NUC_TYPE_COLUMN);
                sqlStmt = stmtGen.getStatement();
                containerSqlTbl = sqlStmt.getPrimaryTable();

                SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                    ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
            }
            else
            {
                if (emd != null)
                {
                    // TODO Allow for null value [change to select the join table and left outer join to the key]
                    // Select of value table, joining to key table
                    iteratorMappingDef = new StatementClassMapping();
                    UnionStatementGenerator stmtGen = new UnionStatementGenerator(storeMgr, clr, valueCls, true, null, null);
                    stmtGen.setOption(StatementGenerator.OPTION_SELECT_NUCLEUS_TYPE);
                    iteratorMappingDef.setNucleusTypeColumnName(UnionStatementGenerator.NUC_TYPE_COLUMN);
                    sqlStmt = stmtGen.getStatement();

                    JavaTypeMapping valueIdMapping = sqlStmt.getPrimaryTable().getTable().getIdMapping();
                    containerSqlTbl = sqlStmt.innerJoin(sqlStmt.getPrimaryTable(), valueIdMapping,
                        containerTable, null, elementMapping, null, null);

                    SQLStatementHelper.selectFetchPlanOfSourceClassInStatement(sqlStmt, iteratorMappingDef,
                        ownerSM.getExecutionContext().getFetchPlan(), sqlStmt.getPrimaryTable(), emd, 0);
                }
                else
                {
                    // Select of value in join table
                    sqlStmt = new SQLStatement(storeMgr, containerTable, null, null);
                    containerSqlTbl = sqlStmt.getPrimaryTable();
                    sqlStmt.select(sqlStmt.getPrimaryTable(), elementMapping, null);
                }
            }
        }

        // Apply condition on owner field to filter by owner
        SQLExpressionFactory exprFactory = storeMgr.getSQLExpressionFactory();
        SQLTable ownerSqlTbl =
            SQLStatementHelper.getSQLTableForMappingOfTable(sqlStmt, containerSqlTbl, ownerMapping);
        SQLExpression ownerExpr = exprFactory.newExpression(sqlStmt, ownerSqlTbl, ownerMapping);
        SQLExpression ownerVal = exprFactory.newLiteralParameter(sqlStmt, ownerMapping, null, "OWNER");
        sqlStmt.whereAnd(ownerExpr.eq(ownerVal), true);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

            StatementClassMapping clsMapping, ExecutionContext ec, Class candidateCls, boolean subclasses,
            String result, String candidateAlias, String candidateTableGroupName)
    {
        SQLStatement stmt = null;

        RDBMSStoreManager storeMgr = (RDBMSStoreManager)ec.getStoreManager();
        DatastoreIdentifier candidateAliasId = null;
        if (candidateAlias != null)
        {
            candidateAliasId = storeMgr.getIdentifierFactory().newDatastoreContainerIdentifier(candidateAlias);
        }

        ClassLoaderResolver clr = ec.getClassLoaderResolver();
        List<DatastoreClass> candidateTables = new ArrayList<DatastoreClass>();
        if (cmd.getInheritanceMetaData().getStrategy() == InheritanceStrategy.COMPLETE_TABLE)
        {
            DatastoreClass candidateTable = storeMgr.getDatastoreClass(cmd.getFullClassName(), clr);
            if (candidateTable != null)
            {
                candidateTables.add(candidateTable);
            }
            if (subclasses)
            {
                Set<String> subclassNames =
                    storeMgr.getSubClassesForClass(cmd.getFullClassName(), subclasses, clr);
                if (subclassNames != null)
                {
                    Iterator<String> subclassIter = subclassNames.iterator();
                    while (subclassIter.hasNext())
                    {
                        String subclassName = subclassIter.next();
                        DatastoreClass tbl = storeMgr.getDatastoreClass(subclassName, clr);
                        if (tbl != null)
                        {
                            candidateTables.add(tbl);
                        }
                    }
                }
            }

            Iterator<DatastoreClass> iter = candidateTables.iterator();
            int maxClassNameLength = cmd.getFullClassName().length();
            while (iter.hasNext())
            {
                DatastoreClass cls = iter.next();
                String className = cls.getType();
                if (className.length() > maxClassNameLength)
                {
                    maxClassNameLength = className.length();
                }
            }

            iter = candidateTables.iterator();
            while (iter.hasNext())
            {
                DatastoreClass cls = iter.next();

                SQLStatement tblStmt =
                    new SQLStatement(parentStmt, storeMgr, cls, candidateAliasId, candidateTableGroupName);
                tblStmt.setClassLoaderResolver(clr);
                tblStmt.setCandidateClassName(cls.getType());

                // Add SELECT of dummy column accessible as "NUCLEUS_TYPE" containing the classname
                JavaTypeMapping m = storeMgr.getMappingManager().getMapping(String.class);
                String nuctypeName = cls.getType();
                if (maxClassNameLength > nuctypeName.length())
                {
                    nuctypeName = StringUtils.leftAlignedPaddedString(nuctypeName, maxClassNameLength);
                }
                StringLiteral lit = new StringLiteral(tblStmt, m, nuctypeName, null);
                tblStmt.select(lit, UnionStatementGenerator.NUC_TYPE_COLUMN);

                if (stmt == null)
                {
                    stmt = tblStmt;
                }
                else
                {
                    stmt.union(tblStmt);
                }
            }
            if (clsMapping != null)
            {
                clsMapping.setNucleusTypeColumnName(UnionStatementGenerator.NUC_TYPE_COLUMN);
            }
        }
        else
        {
            // "new-table", "superclass-table", "subclass-table"
            List<Class> candidateClasses = new ArrayList<Class>();
            if (ClassUtils.isReferenceType(candidateCls))
            {
                // Persistent interface, so find all persistent implementations
                String[] clsNames =
                    storeMgr.getNucleusContext().getMetaDataManager().getClassesImplementingInterface(candidateCls.getName(), clr);
                for (int i=0;i<clsNames.length;i++)
                {
                    Class cls = clr.classForName(clsNames[i]);
                    DatastoreClass table = storeMgr.getDatastoreClass(clsNames[i], clr);
                    candidateClasses.add(cls);
                    candidateTables.add(table);
                    AbstractClassMetaData implCmd = storeMgr.getNucleusContext().getMetaDataManager().getMetaDataForClass(cls, clr);
                    if (implCmd.getIdentityType() != cmd.getIdentityType())
                    {
                        throw new NucleusUserException("You are querying an interface (" + cmd.getFullClassName() + ") " +
                            "yet one of its implementations (" + implCmd.getFullClassName() + ") " +
                            " uses a different identity type!");
                    }
                    else if (cmd.getIdentityType() == IdentityType.APPLICATION)
                    {
                        if (cmd.getPKMemberPositions().length != implCmd.getPKMemberPositions().length)
                        {
                            throw new NucleusUserException("You are querying an interface (" + cmd.getFullClassName() + ") " +
                                "yet one of its implementations (" + implCmd.getFullClassName() + ") " +
                                " has a different number of PK members!");
                        }
                    }
                }
            }
            else
            {
                DatastoreClass candidateTable = storeMgr.getDatastoreClass(cmd.getFullClassName(), clr);
                if (candidateTable != null)
                {
                    // Candidate has own table
                    candidateClasses.add(candidateCls);
                    candidateTables.add(candidateTable);
                }
                else
                {
                    // Candidate stored in subclass tables
                    AbstractClassMetaData[] cmds = storeMgr.getClassesManagingTableForClass(cmd, clr);
                    if (cmds != null && cmds.length > 0)
                    {
                        for (int i=0;i<cmds.length;i++)
                        {
                            DatastoreClass table = storeMgr.getDatastoreClass(cmds[i].getFullClassName(), clr);
                            Class cls = clr.classForName(cmds[i].getFullClassName());
                            candidateClasses.add(cls);
                            candidateTables.add(table);
                        }
                    }
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

            return null;
        }

        SQLStatement sqlStmt = null;

        RDBMSStoreManager storeMgr = (RDBMSStoreManager)this.storeMgr;
        SQLExpressionFactory exprFactory = storeMgr.getSQLExpressionFactory();
        final ClassLoaderResolver clr = ownerSM.getExecutionContext().getClassLoaderResolver();
        iteratorMappingDef = new StatementClassMapping();
        if (elementInfo[0].getDatastoreClass().getDiscriminatorMetaData() != null &&
            elementInfo[0].getDatastoreClass().getDiscriminatorMetaData().getStrategy() != DiscriminatorStrategy.NONE)
        {
            // TODO Only caters for one elementInfo, but with subclass-table we can have multiple
            String elementType = ownerMemberMetaData.getCollection().getElementType();
            if (ClassUtils.isReferenceType(clr.classForName(elementType)))
            {
                String[] clsNames =
                    storeMgr.getNucleusContext().getMetaDataManager().getClassesImplementingInterface(elementType, clr);
                Class[] cls = new Class[clsNames.length];
                for (int i=0; i<clsNames.length; i++)
                {
                    cls[i] = clr.classForName(clsNames[i]);
                }
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        protected void setStatement()
        {
            boolean isEmpty = (value == null || value.size() == 0);
            if (!isEmpty)
            {
                RDBMSStoreManager storeMgr = stmt.getRDBMSManager();
                st.append("(");
                keyExpressions = new ArrayList();

                boolean hadPrev = false;

                Set keys = value.keySet();
                for (Iterator it=keys.iterator(); it.hasNext();)
                {
                    Object current = it.next();
                    if (null != current)
                    {
                        JavaTypeMapping m = storeMgr.getSQLExpressionFactory().getMappingForType(current.getClass(), false);
                        SQLExpression expr = storeMgr.getSQLExpressionFactory().newLiteral(stmt, m, current);

                        // Append the SQLExpression (should be a literal) for the current element.
                        st.append(hadPrev ? "," : "");
                        st.append(expr);
                        keyExpressions.add(expr);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        if (!(expr instanceof TemporalExpression))
        {
            throw new NucleusException(LOCALISER.msg("060001", "getYear()", expr));
        }

        RDBMSStoreManager storeMgr = stmt.getRDBMSManager();
        JavaTypeMapping mapping = storeMgr.getMappingManager().getMapping(String.class);
        SQLExpression day = exprFactory.newLiteral(stmt, mapping, "year");

        ArrayList funcArgs = new ArrayList();
        funcArgs.add(day);
        funcArgs.add(expr);
View Full Code Here

Examples of org.datanucleus.store.rdbms.RDBMSStoreManager

        protected void setStatement()
        {
            boolean isEmpty = (value == null || value.size() == 0);
            if (!isEmpty)
            {
                RDBMSStoreManager storeMgr = stmt.getRDBMSManager();
                valueExpressions = new ArrayList();
                st.append("(");

                boolean hadPrev = false;

                Collection values = value.values();
                for (Iterator it=values.iterator(); it.hasNext();)
                {
                    Object current = it.next();
                    if (null != current)
                    {
                        JavaTypeMapping m = storeMgr.getSQLExpressionFactory().getMappingForType(current.getClass(), false);
                        SQLExpression expr = storeMgr.getSQLExpressionFactory().newLiteral(stmt, m, current);

                        // Append the SQLExpression (should be a literal) for the current element.
                        st.append(hadPrev ? "," : "");
                        st.append(expr);
                        valueExpressions.add(expr);
View Full Code Here
TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.