/*
 * Copyright 2009-2010 by The Regents of the University of California
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * you may obtain a copy of the License from
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package edu.uci.ics.hyracks.storage.am.btree.impls;

import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
import edu.uci.ics.hyracks.storage.am.common.api.IIndexOpContext;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexCursor;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexFrameFactory;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexMetaDataFrame;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOp;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.IntArrayList;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.LongArrayList;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;

public class BTreeOpContext implements IIndexOpContext {
    private final int INIT_ARRAYLIST_SIZE = 6; 
    protected ITreeIndexFrameFactory leafFrameFactory;
    protected ITreeIndexFrameFactory interiorFrameFactory;
    public IBTreeLeafFrame leafFrame;
    public IBTreeInteriorFrame interiorFrame;
    public ITreeIndexMetaDataFrame metaFrame;
    public IndexOp op;
    public ITreeIndexCursor cursor;
    public BTreeCursorInitialState cursorInitialState;
    public RangePredicate pred;
    public BTreeSplitKey splitKey;    
    public LongArrayList pageLsns;
    public IntArrayList smPages;
    public IntArrayList freePages;
    public int opRestarts = 0;
    public boolean exceptionHandled;
    
    public BTreeOpContext(ITreeIndexFrameFactory leafFrameFactory, ITreeIndexFrameFactory interiorFrameFactory,
            ITreeIndexMetaDataFrame metaFrame, MultiComparator cmp) {
        this.leafFrameFactory = leafFrameFactory;
        this.leafFrame = (IBTreeLeafFrame) leafFrameFactory.createFrame();
        if (leafFrame != null) {
            leafFrame.setMultiComparator(cmp);
        }
        this.interiorFrameFactory = interiorFrameFactory;
        this.interiorFrame = (IBTreeInteriorFrame) interiorFrameFactory.createFrame();
        if (interiorFrame != null) {
            interiorFrame.setMultiComparator(cmp);
        }
        this.metaFrame = metaFrame;
        this.pageLsns = new LongArrayList(INIT_ARRAYLIST_SIZE, INIT_ARRAYLIST_SIZE);
    }

    public void reset() {
        if (pageLsns != null)
            pageLsns.clear();
        if (freePages != null)
            freePages.clear();
        if (smPages != null)
            smPages.clear();
        opRestarts = 0;
        exceptionHandled = false;
    }

    @Override
    public void reset(IndexOp newOp) {
        if (newOp == IndexOp.SEARCH || newOp == IndexOp.DISKORDERSCAN) {
            if (cursorInitialState == null) {
                cursorInitialState = new BTreeCursorInitialState(null);
            }
        } else {
            // Insert, update or delete operation.
            if (smPages == null) {
                smPages = new IntArrayList(INIT_ARRAYLIST_SIZE, INIT_ARRAYLIST_SIZE);
            }
            if (freePages == null) {
                freePages = new IntArrayList(INIT_ARRAYLIST_SIZE, INIT_ARRAYLIST_SIZE);
            }
            if (pred == null) {
                pred = new RangePredicate(true, null, null, true, true, null, null);
            }
            if (splitKey == null) {
                splitKey = new BTreeSplitKey(leafFrame.getTupleWriter().createTupleReference());
            }
        }
        op = newOp;
        exceptionHandled = false;
    }

    public IBTreeLeafFrame createLeafFrame() {
        return (IBTreeLeafFrame) leafFrameFactory.createFrame();
    }

    public IBTreeInteriorFrame createInteriorFrame() {
        return (IBTreeInteriorFrame) interiorFrameFactory.createFrame();
    }
}
