1 package com.daffodilwoods.daffodildb.server.sessionsystem; 2 3 import com.daffodilwoods.database.resource.DException; 4 import com.daffodilwoods.database.general.QualifiedIdentifier; 5 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 6 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression._SingleTableExecuter; 7 import com.daffodilwoods.daffodildb.server.datasystem.interfaces._Table; 8 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator; 9 import com.daffodilwoods.daffodildb.server.sessionsystem.sessioncondition._SessionCondition; 10 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.booleanvalueexpression; 11 import com.daffodilwoods.daffodildb.server.sql99.common.TableDetails; 12 import com.daffodilwoods.daffodildb.server.sql99.dql.execution.ConditionSingleTableExecuter; 13 import com.daffodilwoods.daffodildb.server.datasystem.interfaces._IndexTable; 14 import com.daffodilwoods.daffodildb.server.sql99.common.GeneralPurposeStaticClass; 15 import com.daffodilwoods.daffodildb.server.sessionsystem.sessioncondition.MergedSessionCondition; 16 import com.daffodilwoods.daffodildb.server.datasystem.mergesystem.MergeTable; 17 18 26 27 public class RepeatableDataRetriever extends DataRetrieverWithoutCondition implements _DataRetriever{ 28 29 Session session; 30 public RepeatableDataRetriever(Session session) { 31 this.session = session; 32 } 33 34 public _Iterator getIterator(_Table mergeTable, _SingleTableExecuter singleTableExecuter, _ServerSession serverSession, QualifiedIdentifier tableName, ForUpdateTableHandler forUpdateTableHandler) throws DException{ 35 if( (singleTableExecuter.isParameterisedQuery() || ((MergeTable)mergeTable).hasRecordsInMemory() ) && ! singleTableExecuter.isContainsPresent()) 36 return getConditionalIterator(mergeTable,singleTableExecuter,serverSession,tableName,forUpdateTableHandler); 37 return super.getIterator(session, mergeTable, singleTableExecuter, serverSession, tableName, forUpdateTableHandler); 38 } 39 40 public _Iterator getConditionalIterator(_Table mergeTable, _SingleTableExecuter singleTableExecuter, _ServerSession serverSession, QualifiedIdentifier tableName, ForUpdateTableHandler forUpdateTableHandler) throws DException{ 41 42 _SessionCondition repeatableCondition = ((Session)session).getReadRepeatable(); 43 _SessionCondition sessionConditionForTransaction = ((Session)session).getTransactionSessionCondition(); 44 45 46 booleanvalueexpression repeatableFilterCondition =SystemFieldsCharacteristics.getRepeatableFilterCondition(); 47 48 TableDetails td = new TableDetails(); 49 td.setTableName(new String []{tableName.catalog,tableName.schema,tableName.name}); 50 ConditionSingleTableExecuter ste = new ConditionSingleTableExecuter(null,td,serverSession,repeatableFilterCondition,null); 51 52 SessionIndex sessionIndex = new SessionIndex((_IndexTable)mergeTable, serverSession); 53 54 _Iterator repetableFilterIterator = 55 repetableFilterIterator = 56 ste.execute(sessionIndex); 57 58 RepetableTable rt = 59 new RepetableTable(sessionIndex , repetableFilterIterator,GeneralPurposeStaticClass.changeReferences( repeatableFilterCondition.getParameters(null) ), session.getTransactionIdAtStart() , serverSession); 60 _Iterator iterator = singleTableExecuter.execute(rt ); 61 62 _Iterator iteratorRepetable =(_Iterator) new NonIndexedSessionFilterIterator(iterator, repeatableCondition); 63 64 _Iterator baseIteratorForSeriablizable = singleTableExecuter.execute(sessionIndex ); 65 _Iterator iteratorSerialized = (_Iterator) new NonIndexedSessionFilterIterator(baseIteratorForSeriablizable, sessionConditionForTransaction); 66 67 68 _SessionCondition repeatableAndSerializableCondition = new MergedSessionCondition(new _SessionCondition[]{repeatableCondition,sessionConditionForTransaction }); 69 70 71 return new RowIdSessionIterator( new RepetableIterator(new _Iterator[]{iteratorRepetable,iteratorSerialized},rt.getComparator()) 72 , repeatableAndSerializableCondition); 73 74 } 75 76 public _Iterator getFCIterator(_Table mergeTable, 77 QualifiedIdentifier tableName, 78 _SingleTableExecuter 79 conditionExeceuter, 80 _IndexTable foreignConstraintTable) throws 81 DException { 82 _SessionCondition repeatableCondition = ((Session)session).getReadRepeatable(); 83 _SessionCondition sessionConditionForTransaction = ((Session)session).getTransactionSessionCondition(); 84 85 86 booleanvalueexpression repeatableFilterCondition = 87 SystemFieldsCharacteristics.getRepeatableFilterCondition(); 88 _ServerSession serverSession = ((_SessionGetter)foreignConstraintTable).getServerSession(); 89 SessionIndex sessionIndex = new SessionIndex((_IndexTable)mergeTable, serverSession); 90 91 TableDetails tableD = new TableDetails(); 92 tableD.setTableName(new String []{tableName.catalog,tableName.schema,tableName.name}); 93 _SingleTableExecuter filterConditionExecuter = new ConditionSingleTableExecuter(null, tableD,serverSession,repeatableFilterCondition , null); 94 95 _Iterator repetableFilterIterator = filterConditionExecuter.execute((_IndexTable)mergeTable); 96 97 RepetableTable rt = 98 new RepetableTable(sessionIndex , repetableFilterIterator,GeneralPurposeStaticClass.changeReferences( repeatableFilterCondition.getParameters(null) ), session.getTransactionIdAtStart() , serverSession); 99 _Iterator iterator = conditionExeceuter.execute(rt ); 100 101 _Iterator iteratorRepetable =(_Iterator) new NonIndexedSessionFilterIterator(iterator, repeatableCondition); 102 103 _Iterator baseIteratorForSeriablizable = conditionExeceuter.execute(sessionIndex ); 104 _Iterator iteratorSerialized = (_Iterator) new NonIndexedSessionFilterIterator(baseIteratorForSeriablizable, sessionConditionForTransaction); 105 _SessionCondition repeatableAndSerializableCondition = new MergedSessionCondition(new _SessionCondition[]{repeatableCondition,sessionConditionForTransaction }); 106 _Iterator baseIterator = new RepetableIterator(new _Iterator[]{iteratorRepetable,iteratorSerialized},rt.getComparator()); 107 _Iterator fcIterator = ((ForeignConstraintTable)foreignConstraintTable).getIterator(baseIterator); 108 return new RowIdSessionIterator( fcIterator , repeatableAndSerializableCondition); 109 } 110 111 } 112 | Popular Tags |