blob: 9c8865e4ada74e2d78dc4af0a3de3c9b7eb0e8b3 [file] [log] [blame]
/*
* Copyright 2009-2012 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.lsm.invertedindex.inmemory;
import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
import edu.uci.ics.hyracks.storage.am.btree.impls.BTree;
import edu.uci.ics.hyracks.storage.am.btree.impls.BTree.BTreeAccessor;
import edu.uci.ics.hyracks.storage.am.btree.impls.RangePredicate;
import edu.uci.ics.hyracks.storage.am.common.api.IIndexOperationContext;
import edu.uci.ics.hyracks.storage.am.common.impls.NoOpOperationCallback;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.IndexOperation;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
import edu.uci.ics.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizer;
import edu.uci.ics.hyracks.storage.am.lsm.invertedindex.tokenizers.IBinaryTokenizerFactory;
import edu.uci.ics.hyracks.storage.am.lsm.invertedindex.util.InvertedIndexTokenizingTupleIterator;
public class InMemoryInvertedIndexOpContext implements IIndexOperationContext {
public IndexOperation op;
public final BTree btree;
// Needed for search operations,
public RangePredicate btreePred;
public BTreeAccessor btreeAccessor;
public MultiComparator btreeCmp;
public IBinaryComparatorFactory[] tokenCmpFactories;
public MultiComparator tokenFieldsCmp;
// To generate in-memory BTree tuples for insertions.
protected final IBinaryTokenizerFactory tokenizerFactory;
public InvertedIndexTokenizingTupleIterator tupleIter;
public InMemoryInvertedIndexOpContext(BTree btree, IBinaryComparatorFactory[] tokenCmpFactories,
IBinaryTokenizerFactory tokenizerFactory) {
this.btree = btree;
this.tokenCmpFactories = tokenCmpFactories;
this.tokenizerFactory = tokenizerFactory;
}
@Override
public void setOperation(IndexOperation newOp) {
switch (newOp) {
case INSERT:
case DELETE: {
if (tupleIter == null) {
setTokenizingTupleIterator();
}
break;
}
case SEARCH: {
if (btreePred == null) {
btreePred = new RangePredicate(null, null, true, true, null, null);
btreeAccessor = (BTreeAccessor) btree.createAccessor(NoOpOperationCallback.INSTANCE,
NoOpOperationCallback.INSTANCE);
btreeCmp = MultiComparator.createIgnoreFieldLength(btree.getComparatorFactories());
tokenFieldsCmp = MultiComparator.createIgnoreFieldLength(tokenCmpFactories);
}
break;
}
default: {
throw new UnsupportedOperationException("Unsupported operation " + newOp);
}
}
op = newOp;
}
@Override
public void reset() {
op = null;
}
@Override
public IndexOperation getOperation() {
return op;
}
protected void setTokenizingTupleIterator() {
IBinaryTokenizer tokenizer = tokenizerFactory.createTokenizer();
tupleIter = new InvertedIndexTokenizingTupleIterator(tokenCmpFactories.length, btree.getFieldCount()
- tokenCmpFactories.length, tokenizer);
}
}