Package org.jpox.store.mapped.mapping

Examples of org.jpox.store.mapped.mapping.JavaTypeMapping


        if (!(expr instanceof NumericExpression))
        {
            // JDO2 spec [14.6.9] : SUM is invalid on non-numeric types
            throw new JPOXUserException(LOCALISER.msg("037011", "SUM"));
        }
        JavaTypeMapping sumMapping = expr.getMapping();
        if (sumMapping instanceof IntegerMapping || sumMapping instanceof ShortMapping)
        {
            // Integral types return Long
            sumMapping = qs.getStoreManager().getDatastoreAdapter().getMapping(Long.class,
                qs.getStoreManager(), qs.getClassLoaderResolver());
View Full Code Here


        RDBMSAdapter dba = (RDBMSAdapter)mainTable.getStoreManager().getDatastoreAdapter();

        // LEFT OUTER JOINs
        if (!outerTableMappings.isEmpty())
        {
            JavaTypeMapping mainIdMapping = mainTable.getIDMapping();
            iter = outerTableMappings.entrySet().iterator();
            while (iter.hasNext())
            {
                Map.Entry entry = (Map.Entry)iter.next();
                String alias = (String)entry.getKey();
                OuterJoinDefinition def = (OuterJoinDefinition)entry.getValue();

                JavaTypeMapping refMapping = def.getReferenceMapping();
                JavaTypeMapping refDiscrimMapping = def.getReferenceDiscrimMapping();
                Object[] refDiscrimValues = def.getDiscriminatorValues();
                JavaTypeMapping refTypeMapping = def.getReferenceTypeMapping();

                String refTableName = ((Column)refMapping.getDataStoreMapping(0).getDatastoreField()).getDatastoreContainerObject().toString();
                if (dba.supportsAnsiJoinSyntax())
                {
                    // ANSI syntax left outer join
                    stmt.append(" LEFT OUTER JOIN ").append(refTableName).append(" ").append(alias);
                    if (datastoreAdapter.getPlaceWithOptionWithinJoinClauses())
                    {
                        stmt.append(" WITH ").append(datastoreAdapter.getSelectWithLockOption());                       
                    }
                    stmt.append(" ON ");
                    if (refDiscrimMapping != null && refDiscrimValues != null)
                    {
                        stmt.append("(");
                    }
                    int countMainIdFields = mainIdMapping.getNumberOfDatastoreFields();
                    for (int i=0; i<countMainIdFields; i++)
                    {
                        if (i > 0)
                        {
                            stmt.append(" AND ");
                        }
                        stmt.append(getColumnReference("THIS", mainIdMapping.getDataStoreMapping(i).getDatastoreField()));
                        stmt.append(" = ");
                        stmt.append(getColumnReference(alias, refMapping.getDataStoreMapping(i).getDatastoreField()));
                    }

                    if (refDiscrimMapping != null && refDiscrimValues != null)
                    {
                        // Add constraint on discriminator in related table
                        stmt.append(" AND (");
                        for (int i=0;i<refDiscrimValues.length;i++)
                        {
                            if (i > 0)
                            {
                                stmt.append(" OR ");
                            }
                            stmt.append(getColumnReference(alias, refDiscrimMapping.getDataStoreMapping(0).getDatastoreField()));
                            stmt.append(" = ");
                            // TODO Cater for numeric discriminator types
                            // TODO Should we always use single quote for character values ?
                            stmt.append("'" + refDiscrimValues[i] + "'");
                        }
                        stmt.append("))");
                    }
                    else if (refTypeMapping != null)
                    {
                        // Add join to reference type mapping table from reference table
                        String refTypeTableName = refTypeMapping.getDataStoreMapping(0).getDatastoreField().getDatastoreContainerObject().toString();
                        stmt.append(" INNER JOIN ").append(refTypeTableName).append(" ").append(alias + "_SUB");
                        if (datastoreAdapter.getPlaceWithOptionWithinJoinClauses())
                        {
                            stmt.append(" WITH ").append(datastoreAdapter.getSelectWithLockOption());                       
                        }
                        stmt.append(" ON ");
                        int countRefTypeTableFields = refTypeMapping.getNumberOfDatastoreFields();
                        JavaTypeMapping refIdMapping = refMapping.getDatastoreContainer().getIDMapping();
                        for (int i=0; i<countRefTypeTableFields; i++)
                        {
                            if (i > 0)
                            {
                                stmt.append(" AND ");
                            }
                            stmt.append(getColumnReference(alias + "_SUB", refTypeMapping.getDataStoreMapping(i).getDatastoreField()));
                            stmt.append(" = ");
                            stmt.append(getColumnReference(alias, refIdMapping.getDataStoreMapping(i).getDatastoreField()));
                        }
                    }
                }
                else
                {
                    // Non-ANSI syntax - add table to "stmt", and join definition to "joinConditions"
                    stmt.append(',').append(refTableName).append(" ").append(alias);

                    if (refDiscrimMapping != null && refDiscrimValues != null)
                    {
                        joinConditions.append("(");
                    }
                    int countMainIdFields = mainIdMapping.getNumberOfDatastoreFields();
                    for (int i=0; i<countMainIdFields; i++)
                    {
                        if (joinConditions.length() > 0)
                        {
                            joinConditions.append(" AND ");
                        }
                        joinConditions.append(
                            dba.getNonAnsiLeftOuterJoinWhereClause(mainIdMapping.getDataStoreMapping(i).getDatastoreField().toString(),
                                                                   refMapping.getDataStoreMapping(i).getDatastoreField().toString()));
                    }
                    if (refDiscrimMapping != null && refDiscrimValues != null)
                    {
                        // Add constraint on discriminator in related table
                        joinConditions.append(" AND (");
                        for (int i=0;i<refDiscrimValues.length;i++)
                        {
                            if (i > 0)
                            {
                                joinConditions.append(" OR ");
                            }
                            joinConditions.append(getColumnReference(alias, refDiscrimMapping.getDataStoreMapping(0).getDatastoreField()));
                            joinConditions.append(" = ");
                            // TODO Cater for numeric discriminator types
                            // TODO Should we always use single quote for character values ?
                            joinConditions.append("'" + refDiscrimValues[i] + "'");
                        }
                        joinConditions.append("))");
                    }
                    else if (refTypeMapping != null)
                    {
                        // Add join to ref type mapping table
                        String refTypeTableName = refTypeMapping.getDataStoreMapping(0).getDatastoreField().getDatastoreContainerObject().toString();
                        stmt.append(',').append(refTypeTableName).append(" ").append(alias + "_SUB");

                        int countRefTypeTableFields = refTypeMapping.getNumberOfDatastoreFields();
                        JavaTypeMapping refIdMapping = refMapping.getDatastoreContainer().getIDMapping();
                        for (int i=0; i<countRefTypeTableFields; i++)
                        {
                            if (i > 0)
                            {
                                stmt.append(" AND ");
                            }
                            joinConditions.append(
                                dba.getNonAnsiInnerJoinWhereClause(refTypeMapping.getDataStoreMapping(i).getDatastoreField().toString(),
                                                                   refIdMapping.getDataStoreMapping(i).getDatastoreField().toString()));
                        }
                    }
                }
            }
        }

        // INNER JOINs
        if (!innerTableMappings.isEmpty())
        {
            JavaTypeMapping mainIdMapping = mainTable.getIDMapping();
            iter = innerTableMappings.entrySet().iterator();
            while (iter.hasNext())
            {
                Map.Entry entry = (Map.Entry)iter.next();
                String alias = (String)entry.getKey();
                InnerJoinDefinition join = (InnerJoinDefinition)entry.getValue();
                if (dba.supportsAnsiJoinSyntax())
                {
                    stmt.append(" INNER JOIN ").append(join.getTable()).append(" ").append(alias);
                    if (lock && datastoreAdapter.getPlaceWithOptionWithinJoinClauses())
                    {
                        stmt.append(" WITH ").append(datastoreAdapter.getSelectWithLockOption());                       
                    }
                    stmt.append(" ON ");
                    int countReferenceFields = join.getReferenceMapping().getNumberOfDatastoreFields();
                    for (int i=0; i<countReferenceFields; i++)
                    {
                        stmt.append(getColumnReference("THIS", mainIdMapping.getDataStoreMapping(i).getDatastoreField()));
                        stmt.append(" = ");
                        stmt.append(getColumnReference(alias, join.getReferenceMapping().getDataStoreMapping(i).getDatastoreField()));
                        if (i < join.getReferenceMapping().getNumberOfDatastoreFields()-1)
                        {
                            stmt.append(" AND ");
View Full Code Here

            byte[] bytes)
    {
        // Generate "SELECT {blobColumn} FROM TABLE WHERE ID=? FOR UPDATE" statement
        FetchStatement fetchStmt = new RDBMSFetchStatement(datastoreContainer);
        fetchStmt.select(mapping.getDatastoreField());
        JavaTypeMapping idMapping = datastoreContainer.getIDMapping();
        for (int i = 0; i < idMapping.getNumberOfDatastoreFields(); i++)
        {
            fetchStmt.andCondition(fetchStmt.referenceDatastoreField(idMapping.getDataStoreMapping(i).getDatastoreField()) + " = ?");
        }
        String textStmt = fetchStmt.toString(true);

        if (sm.getPcObjectType() != StateManager.PC)
        {
            // This mapping is embedded, so navigate back to the real owner since that is the "id" in the table
            StateManager[] embeddedOwners = sm.getEmbeddedOwners();
            if (embeddedOwners != null)
            {
                // Just use the first owner
                // TODO Should check if the owner is stored in this table
                sm = embeddedOwners[0];
            }
        }

        try
        {
            ObjectManager om = sm.getObjectManager();
            RDBMSManager storeMgr = (RDBMSManager)om.getStoreManager();
            ManagedConnection mconn = storeMgr.getConnection(om);
            SQLController sqlControl = storeMgr.getSQLController();

            try
            {
                PreparedStatement ps = sqlControl.getStatementForQuery(mconn, textStmt);
                try
                {
                    Object pcObject = sm.getObject();
                    idMapping.setObject(om, ps, Mappings.getParametersIndex(1, idMapping), pcObject);

                    ResultSet rs = sqlControl.executeStatementQuery(mconn, textStmt, ps);

                    try
                    {
View Full Code Here

                if (subclassTable != null && !subclassTable.getIdentifier().equals(schemaDataOption.getDatastoreContainerObject().getIdentifier()))
                {
                    DatastoreIdentifier subclassTableIdentifier = storeMgr.getIdentifierFactory().newIdentifier(IdentifierFactory.TABLE, "SUBCLASS" + (subclasses_seq_id++));
                    QueryExpression st = storeMgr.getDatastoreAdapter().newQueryStatement(subclassTable, subclassTableIdentifier, om.getClassLoaderResolver());
                    LogicSetExpression table_expr_sub = st.newTableExpression(subclassTable, subclassTableIdentifier);
                    JavaTypeMapping subMapping = subclassTable.getIDMapping();
                    st.select(subclassTableIdentifier, subMapping);

                    ScalarExpression subExpr = subMapping.newScalarExpression(qs, table_expr_sub);
                    ScalarExpression schExpr =
                        (((DatastoreClass)schemaDataOption.getDatastoreContainerObject()).getIDMapping()).newScalarExpression(
                            qs,qs.getMainTableExpression());
                    qs.leftOuterJoin(subExpr, schExpr, table_expr_sub, true);
                    qs.andCondition(new NullLiteral(qs).eq(subExpr));
                }
            }

            // WHERE (object id) = ?
            JavaTypeMapping idMapping = ((DatastoreClass)schemaDataOption.getDatastoreContainerObject()).getIDMapping();

            // We have to create a StateManager here just to map fields from the AppId key object
            // to the table fields. Really the table should have some way of doing this. TODO : Refactor this
            Class pc_class = om.getClassLoaderResolver().classForName(schemaDataOption.getName());
            StateManager sm = StateManagerFactory.newStateManagerForHollow(om,pc_class,id);
            ScalarExpression fieldExpr = idMapping.newScalarExpression(qs, qs.getMainTableExpression());
            ScalarExpression fieldValue = idMapping.newLiteral(qs, sm.getObject());
            qs.andCondition(fieldExpr.eq(fieldValue), true);
            // Discriminator for this class
            JavaTypeMapping discrimMapping = schemaDataOption.getDatastoreContainerObject().getDiscriminatorMapping(false);
            DiscriminatorMetaData discrimMetaData = cmd.getInheritanceMetaData().getDiscriminatorMetaData();
            if (discrimMapping != null)
            {
                ScalarExpression discrimExpr = discrimMapping.newScalarExpression(qs, qs.getMainTableExpression());
                Object value = null;
                if (cmd.getDiscriminatorStrategy() == DiscriminatorStrategy.CLASS_NAME)
                {
                    value = schemaDataOption.getName();
                }
                else if (cmd.getDiscriminatorStrategy() == DiscriminatorStrategy.VALUE_MAP)
                {
                    value = discrimMetaData.getValue();
                }
                ScalarExpression discrimValue = discrimMapping.newLiteral(qs, value);
                qs.andCondition(discrimExpr.eq(discrimValue), true);
            }

            if (qs_base==null)
            {
View Full Code Here

        // WHERE (object id) = ?
        // We have to create a StateManager here just to map fields from the AppId key object to the table fields.
        // Really the table should have some way of doing this. TODO : Refactor this
        StateManager sm = StateManagerFactory.newStateManagerForHollow(om, objectClass, id);
        JavaTypeMapping idMapping = primaryTable.getIDMapping();
        ScalarExpression fieldExpr = idMapping.newScalarExpression(stmt, stmt.getMainTableExpression());
        ScalarExpression fieldValue = idMapping.newLiteral(stmt, sm.getObject());
        stmt.andCondition(fieldExpr.eq(fieldValue), true);

        // Perform the query
        try
        {
View Full Code Here

     * @param expectedMappingType
     */
    private void assertCompatibleFieldType(AbstractMemberMetaData fmd, ClassLoaderResolver clr, Class type, Class expectedMappingType)
    {
        DatastoreClass ownerTable = getDatastoreClass(fmd.getClassName(), clr);
        JavaTypeMapping m = ownerTable.getFieldMapping(fmd);
        if (!expectedMappingType.isAssignableFrom(m.getClass()))
        {
            throw new IncompatibleFieldTypeException(fmd.getFullFieldName(),
                type.getName(), fmd.getTypeName());
        }
    }
View Full Code Here

            om.getClassLoaderResolver());
        if (tbl == null)
        {
            tbl = getTableForStrategy(cmd,absoluteFieldNumber,om.getClassLoaderResolver());
        }
        JavaTypeMapping m = null;
        if (mmd != null)
        {
            m = tbl.getFieldMapping(mmd);
            if (m == null)
            {
                // Field not mapped in root table so use passed-in table
                tbl = getTableForStrategy(cmd,absoluteFieldNumber,om.getClassLoaderResolver());
                m = tbl.getFieldMapping(mmd);
            }
        }
        else
        {
            m = tbl.getIDMapping();
        }
        StringBuffer columnsName = new StringBuffer();
        for (int i = 0; i < m.getNumberOfDatastoreFields(); i++)
        {
            if (i > 0)
            {
                columnsName.append(",");
            }
            columnsName.append(m.getDataStoreMapping(i).getDatastoreField().getIdentifier().toString());
        }

        Properties properties = new Properties();
        properties.setProperty("class-name", cmd.getFullClassName());
        properties.put("root-class-name", cmd.getBaseAbstractClassMetaData().getFullClassName());
View Full Code Here

        {
            im.value = ct.getIdentifier().toString();
            return;
        }

        JavaTypeMapping m;
        if (im.fieldName.equals("this"))
        {
            if (!(ct instanceof ClassTable))
            {
                throw new JPOXUserException(LOCALISER_RDBMS.msg("050034", im.className));
            }

            if (im.subfieldName != null)
            {
                throw new JPOXUserException(LOCALISER_RDBMS.msg("050035", im.className, im.fieldName, im.subfieldName));
            }
            m = ((DatastoreContainerObject) ct).getIDMapping();
        }
        else
        {
            AbstractMemberMetaData fmd = getMetaDataManager().getMetaDataForMember(im.className, im.fieldName, clr);
            m = ct.getFieldMapping(fmd);
            DatastoreContainerObject t = getDatastoreContainerObject(fmd);
            if (im.subfieldName == null)
            {
                if (t != null)
                {
                    im.value = t.getIdentifier().toString();
                    return;
                }
            }
            else
            {
                if (t instanceof CollectionTable)
                {
                    CollectionTable collTable = (CollectionTable) t;
                    if (im.subfieldName.equals("owner"))
                    {
                        m = collTable.getOwnerMapping();
                    }
                    else if (im.subfieldName.equals("element"))
                    {
                        m = collTable.getElementMapping();
                    }
                    else if (im.subfieldName.equals("index"))
                    {
                        m = collTable.getOrderMapping();
                    }
                    else
                    {
                        throw new JPOXUserException(LOCALISER_RDBMS.msg(
                            "050036", im.subfieldName, im));
                    }
                }
                else if (t instanceof MapTable)
                {
                    MapTable mt = (MapTable) t;
                    if (im.subfieldName.equals("owner"))
                    {
                        m = mt.getOwnerMapping();
                    }
                    else if (im.subfieldName.equals("key"))
                    {
                        m = mt.getKeyMapping();
                    }
                    else if (im.subfieldName.equals("value"))
                    {
                        m = mt.getValueMapping();
                    }
                    else
                    {
                        throw new JPOXUserException(LOCALISER_RDBMS.msg(
                                "050037",
                                im.subfieldName, im));
                    }
                }
                else
                {
                    throw new JPOXUserException(LOCALISER_RDBMS.msg(
                            "050035", im.className,
                            im.fieldName, im.subfieldName));
                }
            }
        }
        im.value = ((Column)m.getDataStoreMapping(0).getDatastoreField()).getIdentifier().toString();
    }
View Full Code Here

            String value)
    {
        // Generate "SELECT {clobColumn} FROM TABLE WHERE ID=? FOR UPDATE" statement
        FetchStatement fetchStmt = new RDBMSFetchStatement(datastoreContainer);
        fetchStmt.select(mapping.getDatastoreField());
        JavaTypeMapping idMapping = datastoreContainer.getIDMapping();
        for (int i = 0; i < idMapping.getNumberOfDatastoreFields(); i++)
        {
            fetchStmt.andCondition(fetchStmt.referenceDatastoreField(idMapping.getDataStoreMapping(i).getDatastoreField()) + " = ?");
        }
        String textStmt = fetchStmt.toString(true);

        if (sm.getPcObjectType() != StateManager.PC)
        {
            // This mapping is embedded, so navigate back to the real owner since that is the "id" in the table
            StateManager[] embeddedOwners = sm.getEmbeddedOwners();
            if (embeddedOwners != null)
            {
                // Just use the first owner
                // TODO Should check if the owner is stored in this table
                sm = embeddedOwners[0];
            }
        }

        try
        {
            ObjectManager om = sm.getObjectManager();
            RDBMSManager storeMgr = (RDBMSManager)om.getStoreManager();
            ManagedConnection mconn = storeMgr.getConnection(om);
            SQLController sqlControl = storeMgr.getSQLController();

            try
            {
                PreparedStatement ps = sqlControl.getStatementForQuery(mconn, textStmt);

                try
                {
                    Object pcObject = sm.getObject();
                    idMapping.setObject(om, ps, Mappings.getParametersIndex(1, idMapping), pcObject);

                    ResultSet rs = sqlControl.executeStatementQuery(mconn, textStmt, ps);
                    try
                    {
                        if (!rs.next())
View Full Code Here

    statementExpressionIndex = new StatementExpressionIndex[fieldCount];
        int prefetchFieldCount = 0;

        for (int i=0; i<fieldCount; ++i)
        {
            JavaTypeMapping m = view.getFieldMapping(cmd.getMetaDataForManagedMemberAtAbsolutePosition(i));
            if (m != null)
            {
                if (!m.includeInFetchStatement() || m instanceof AbstractContainerMapping)
                {
                    throw new JPOXException(LOCALISER_RDBMS.msg("053001",
                        m, candidateClass.getName())).setFatal();
                }
               
View Full Code Here

TOP

Related Classes of org.jpox.store.mapped.mapping.JavaTypeMapping

Copyright © 2018 www.massapicom. 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.