1 package com.daffodilwoods.daffodildb.server.sessionsystem; 2 3 import com.daffodilwoods.daffodildb.server.datasystem.interfaces._Table; 4 import com.daffodilwoods.daffodildb.server.sql99.dql.iterator._Iterator; 5 import com.daffodilwoods.database.resource.DException; 6 import com.daffodilwoods.daffodildb.server.serversystem._ServerSession; 7 import com.daffodilwoods.daffodildb.server.sql99.utils._Reference; 8 import com.daffodilwoods.daffodildb.server.sessionsystem.sessioncondition._SessionCondition; 9 import com.daffodilwoods.daffodildb.server.datasystem.interfaces._IndexTable; 10 import com.daffodilwoods.daffodildb.server.datasystem.interfaces._MergeTable; 11 import com.daffodilwoods.database.general.QualifiedIdentifier; 12 import java.lang.ref.WeakReference ; 13 import com.daffodilwoods.daffodildb.server.datasystem.mergesystem.MergeTable; 14 import com.daffodilwoods.daffodildb.server.sql99.expression.booleanvalueexpression.*; 15 16 24 25 public class CommittedDataRetriever extends DataRetrieverWithoutCondition implements _DataRetriever{ 26 27 Session session; 28 public CommittedDataRetriever(Session session) { 29 this.session = session; 30 } 31 32 public _Iterator getIterator(_Table mergeTable, _SingleTableExecuter singleTableExecuter, _ServerSession serverSession, QualifiedIdentifier tableName, ForUpdateTableHandler forUpdateTableHandler) throws DException{ 33 if(( singleTableExecuter.isParameterisedQuery() || ((MergeTable)mergeTable).hasRecordsInMemory()) && ! singleTableExecuter.isContainsPresent() ){ 34 return getConditionalIterator(mergeTable, singleTableExecuter, 35 serverSession, tableName, 36 forUpdateTableHandler,false); 37 } 38 return super.getIterator(session, mergeTable, singleTableExecuter, serverSession, tableName, forUpdateTableHandler); 39 } 40 41 private _Iterator getConditionalIterator(_Table mergeTable, _SingleTableExecuter singleTableExecuter, _ServerSession serverSession, QualifiedIdentifier tableName, ForUpdateTableHandler forUpdateTableHandler,boolean isCheckingForLocking) throws DException{ 42 43 _Reference[] references = singleTableExecuter.getReferences(); 44 boolean questionMarkNotFound = references == null ; 45 _SessionCondition readCommittedLock = ((Session)session).getReadCommittedForLockModified(); 46 SessionIndex sessionIndex = new SessionIndex(((_MergeTable)mergeTable).getMemoryTable(), serverSession); 47 _Iterator baseIteratorForLock = singleTableExecuter.executeForDirtyLock( sessionIndex ); 48 _Iterator iterator = new NonIndexedSessionFilterIterator(baseIteratorForLock , readCommittedLock); 49 50 _SessionCondition readCommitted = ((Session)session).getReadCommitted(); 51 SessionIndex sessionIndexForFile = new SessionIndex(((_IndexTable)mergeTable), serverSession); 52 _Iterator baseIteratorForFile = singleTableExecuter.execute( sessionIndexForFile); 53 _Iterator fileIterator = new NonIndexedSessionFilterIterator(baseIteratorForFile, readCommitted); 54 55 if(singleTableExecuter.hasForUpdate()) { 56 Object sessionId = ((Session)session).getSuperMostSessionId(); 57 if(questionMarkNotFound){ 58 forUpdateTableHandler.addForUpdateVariableValues(sessionId,new ConditionReferenceValues(singleTableExecuter.getCondition(), null, null),new WeakReference (serverSession)); 59 } 60 ForUpdateIterator fui = new ForUpdateIterator(iterator, fileIterator, (SessionDatabase)session.getSessionDatabase(),questionMarkNotFound, singleTableExecuter.getCondition() , forUpdateTableHandler , sessionId, references ,new WeakReference (serverSession),serverSession,tableName); 61 return new RowIdSessionIterator( fui, readCommitted); 62 } 63 CommitedSessionIterator iter = new CommitedSessionIterator(iterator, fileIterator, (SessionDatabase)session.getSessionDatabase(), questionMarkNotFound,serverSession,tableName,isCheckingForLocking); 64 iter.setTableName(tableName); 65 return new RowIdSessionIterator( iter, readCommitted); 66 67 } 68 69 70 public _Iterator getConditionalIterator(_Table mergeTable, _SingleTableExecuter singleTableExecuter, _ServerSession serverSession, QualifiedIdentifier tableName, ForUpdateTableHandler forUpdateTableHandler) throws DException{ 71 return getConditionalIterator(mergeTable, singleTableExecuter, 72 serverSession, tableName, 73 forUpdateTableHandler,true); 74 75 98 } 99 100 public _Iterator getFCIterator(_Table mergeTable, 101 QualifiedIdentifier tableName, 102 _SingleTableExecuter 103 conditionExecuter, 104 _IndexTable foreignConstraintTable) throws 105 DException { 106 boolean questionMarkNotFound = conditionExecuter.getReferences() == null ? true : false; 107 _SessionCondition readCommittedLock = ((Session)session).getReadCommittedForLock(); 108 _ServerSession serverSession = ((ForeignConstraintTable)foreignConstraintTable).getServerSession(); 109 SessionIndex sessionIndex = new SessionIndex(((_MergeTable)mergeTable).getMemoryTable(), serverSession); 110 _Iterator baseIteratorForLock = conditionExecuter.execute( sessionIndex ); 111 _Iterator iterator = new NonIndexedSessionFilterIterator(baseIteratorForLock , readCommittedLock); 112 113 _SessionCondition readCommitted = ((Session)session).getReadCommitted(); 114 SessionIndex sessionIndexForFile = new SessionIndex(((_MergeTable)mergeTable).getFileTable(), serverSession); 115 CommittedTable committedTable = new CommittedTable(sessionIndexForFile); 116 _Iterator baseIteratorForFile = conditionExecuter.execute( committedTable); 117 _Iterator fileIterator = new NonIndexedSessionFilterIterator(baseIteratorForFile, readCommitted); 118 119 120 _Iterator baseIteratorForMemory = conditionExecuter.execute( sessionIndex); 121 _Iterator memoryIterator = new NonIndexedSessionFilterIterator(baseIteratorForMemory, readCommitted); 122 123 _Iterator baseIteratorForSeek = conditionExecuter.execute( sessionIndex); 124 _Iterator memoryIteratorForSeek = new NonIndexedSessionFilterIterator(baseIteratorForSeek, readCommitted); 125 _Iterator mIterator = new CommittedIterator( new _Iterator[]{ memoryIterator, fileIterator},committedTable.getComparator(), ((Session)session).getRecursiveSessionIds(),memoryIteratorForSeek); 126 _Iterator committedSessionIterator = new CommitedSessionIterator(iterator, mIterator, (SessionDatabase)session.getSessionDatabase(), questionMarkNotFound,serverSession,tableName,true); 127 _Iterator fcIterator = ((ForeignConstraintTable)foreignConstraintTable).getIterator(committedSessionIterator); 128 return new RowIdSessionIterator( fcIterator, readCommitted); 129 } 130 131 } 132 | Popular Tags |