001: /*
002: * Copyright (c) 1998 - 2005 Versant Corporation
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * Versant Corporation - initial API and implementation
010: */
011: package com.versant.core.jdbc.fetch;
012:
013: import com.versant.core.metadata.ClassMetaData;
014: import com.versant.core.metadata.MDStatics;
015: import com.versant.core.jdbc.sql.exp.SelectExp;
016: import com.versant.core.jdbc.sql.exp.SqlExp;
017: import com.versant.core.jdbc.metadata.JdbcClass;
018: import com.versant.core.jdbc.metadata.JdbcColumn;
019: import com.versant.core.jdbc.metadata.JdbcTable;
020: import com.versant.core.jdbc.JdbcOID;
021: import com.versant.core.common.OID;
022:
023: import java.sql.ResultSet;
024: import java.sql.SQLException;
025:
026: /**
027: * A fetch of the OID (primary key) for a class. This when there is an object
028: * in the ResultSet whose primary key is not available elsewhere or otherwise
029: * read as part of a State. Example 'SELECT o FROM Order AS o' will use one
030: * of these to get the OID for each Order returned.
031: */
032: public class FopGetOID extends FetchOp {
033:
034: private final FetchOpData src;
035: private final ClassMetaData cmd;
036: private final Data data;
037:
038: private int firstColIndex; // the index of our first select list col
039:
040: /**
041: * This gets our OID from fetchData and delegates to our src for
042: * the OID and ResultSet.
043: */
044: public class Data extends FetchOpDataProxy {
045:
046: public Data(FetchOpData src) {
047: super (src);
048: }
049:
050: public void setOID(FetchResultImp fetchResult, OID oid) {
051: fetchResult.setData(FopGetOID.this , oid);
052: }
053:
054: public OID getOID(FetchResultImp fetchResult) {
055: return (OID) fetchResult.getData(FopGetOID.this );
056: }
057:
058: public String getDescription() {
059: return " [" + getIndex() + "]";
060: }
061: }
062:
063: public FetchOpData getOutputData() {
064: return data;
065: }
066:
067: /**
068: * Fetch an OID for the heirachy based on cmd.
069: */
070: public FopGetOID(FetchSpec spec, FetchOpData src, ClassMetaData cmd) {
071: super (spec);
072: this .src = src;
073: this .cmd = cmd.top;
074: data = new Data(src);
075: }
076:
077: /**
078: * Init this FetchOp and return the expressions that we need to be added
079: * to the select list of the query or null if none. The FetchOp may
080: * add additional FetchOp's to the spec.
081: */
082: public SqlExp init(SelectExp root, int firstColIndex) {
083: this .firstColIndex = firstColIndex;
084: JdbcClass jdbcClass = (JdbcClass) cmd.storeClass;
085: JdbcTable table = jdbcClass.table;
086: return JdbcColumn.toSqlExp(table.pk, root);
087: }
088:
089: public void fetch(FetchResultImp fetchResult) throws SQLException {
090: ResultSet rs = src.getResultSet(fetchResult);
091: if (rs == null) {
092: return; // nothing to fetch
093: }
094: JdbcOID oid = (JdbcOID) cmd.createOID(!cmd.isInHeirachy());
095: if (oid.copyKeyFields(rs, firstColIndex)) {
096: data.setOID(fetchResult, oid);
097: }
098: }
099:
100: public String getDescription() {
101: return cmd.qname + src.getDescription();
102: }
103:
104: public int getResultType() {
105: return MDStatics.OID;
106: }
107:
108: public Object getResult(FetchResultImp fetchResult) {
109: return data.getOID(fetchResult);
110: }
111:
112: }
|