001: /*
002:
003: Derby - Class org.apache.derby.impl.store.access.btree.index.B2IMaxScan
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.store.access.btree.index;
023:
024: import org.apache.derby.iapi.services.sanity.SanityManager;
025:
026: import org.apache.derby.iapi.error.StandardException;
027: import org.apache.derby.iapi.store.access.conglomerate.Conglomerate;
028: import org.apache.derby.iapi.store.access.conglomerate.TransactionManager;
029: import org.apache.derby.iapi.store.access.ConglomerateController;
030: import org.apache.derby.iapi.store.access.DynamicCompiledOpenConglomInfo;
031: import org.apache.derby.iapi.store.access.GenericScanController;
032: import org.apache.derby.iapi.store.access.Qualifier;
033: import org.apache.derby.iapi.types.RowLocation;
034: import org.apache.derby.iapi.store.access.ScanController;
035: import org.apache.derby.iapi.store.access.StaticCompiledOpenConglomInfo;
036: import org.apache.derby.iapi.store.access.TransactionController;
037:
038: import org.apache.derby.iapi.store.raw.LockingPolicy;
039: import org.apache.derby.iapi.store.raw.Transaction;
040:
041: import org.apache.derby.iapi.types.DataValueDescriptor;
042:
043: import org.apache.derby.iapi.services.io.FormatableBitSet;
044:
045: import org.apache.derby.impl.store.access.btree.BTreeController;
046: import org.apache.derby.impl.store.access.btree.BTreeLockingPolicy;
047: import org.apache.derby.impl.store.access.btree.BTreeMaxScan;
048:
049: import org.apache.derby.impl.store.access.conglomerate.ConglomerateUtil;
050:
051: /**
052: Scan used to find maximum value in the secondary index.
053:
054: This class implements an optimized interface to find the maximum row,
055: for a set of rows between an input start and stop key.
056:
057: Note most work of this class is inherited from the generic btree implementation.
058: This class initializes the top level object and deals with locking information
059: specific to a secondary index implementation of a btree.
060:
061: **/
062:
063: public class B2IMaxScan extends BTreeMaxScan {
064:
065: /*
066: ** Fields of B2IMaxScan.
067: */
068: private ConglomerateController base_cc_for_locking;
069:
070: /*
071: ** Methods of B2IMaxScan.
072: */
073:
074: B2IMaxScan() {
075: // Perform the generic b-tree scan construction.
076: super ();
077: }
078:
079: /**
080: Close the scan.
081: @see GenericScanController#newRowLocationTemplate
082: **/
083: public void close() throws StandardException {
084: super .close();
085:
086: if (base_cc_for_locking != null) {
087: base_cc_for_locking.close();
088: base_cc_for_locking = null;
089: }
090: }
091:
092: /**
093: Close the scan, a commit or abort is about to happen.
094: **/
095: public boolean closeForEndTransaction(boolean closeHeldScan)
096: throws StandardException {
097: boolean ret_val = super .closeForEndTransaction(closeHeldScan);
098:
099: if (SanityManager.DEBUG)
100: SanityManager.ASSERT(ret_val,
101: "B2IMaxScan never should be held across a commit.");
102:
103: if (base_cc_for_locking != null) {
104: base_cc_for_locking.close();
105: base_cc_for_locking = null;
106: }
107:
108: return (ret_val);
109: }
110:
111: /**
112: Initialize the scan for use.
113: <p>
114: Any changes to this method may have to be reflected in close as well.
115: <p>
116: The btree init opens the container (super.init), and stores away the
117: state of the qualifiers. The actual searching for the first position
118: is delayed until the first next() call.
119:
120: @exception StandardException Standard exception policy.
121: **/
122: public void init(TransactionManager xact_manager,
123: Transaction rawtran, int open_mode, int lock_level,
124: LockingPolicy locking_policy, int isolation_level,
125: boolean open_for_locking, FormatableBitSet scanColumnList,
126: B2I conglomerate, B2IUndo undo) throws StandardException {
127: // open and lock the base table.
128:
129: int base_open_mode = open_mode
130: | TransactionController.OPENMODE_FOR_LOCK_ONLY;
131:
132: // open the base conglomerate - just to get lock
133: base_cc_for_locking = xact_manager.openConglomerate(
134: conglomerate.baseConglomerateId, false, base_open_mode,
135: lock_level, isolation_level);
136:
137: BTreeLockingPolicy b2i_locking_policy = conglomerate
138: .getBtreeLockingPolicy(rawtran, lock_level, open_mode,
139: isolation_level, base_cc_for_locking, this );
140:
141: super .init(
142: xact_manager,
143: rawtran,
144: false,
145: open_mode,
146: lock_level,
147: b2i_locking_policy,
148: scanColumnList,
149: (DataValueDescriptor[]) null,// no start position supported
150: ScanController.NA, // no start position supported
151: (Qualifier[][]) null, // no qualifier supported
152: (DataValueDescriptor[]) null,// no stop position supported
153: ScanController.NA, // no stop position supported
154: conglomerate, undo,
155: (StaticCompiledOpenConglomInfo) null,
156: (DynamicCompiledOpenConglomInfo) null);
157: }
158: }
|