/*
* Copyright 2005-2010 Roger Kapsi, Sam Berlin
*
* 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 at
*
* 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 org.apache.cassandra.index.sasi.utils.trie;
import java.util.Map;
import java.util.Map.Entry;
/**
* This class is taken from https://github.com/rkapsi/patricia-trie (v0.6), and slightly modified
* to correspond to Cassandra code style, as the only Patricia Trie implementation,
* which supports pluggable key comparators (e.g. commons-collections PatriciaTrie (which is based
* on rkapsi/patricia-trie project) only supports String keys)
* but unfortunately is not deployed to the maven central as a downloadable artifact.
*/
/**
* A {@link Cursor} can be used to traverse a {@link Trie}, visit each node
* step by step and make {@link Decision}s on each step how to continue with
* traversing the {@link Trie}.
*/
public interface Cursor<K, V>
{
/**
* The {@link Decision} tells the {@link Cursor} what to do on each step
* while traversing the {@link Trie}.
*
* NOTE: Not all operations that work with a {@link Cursor} support all
* {@link Decision} types
*/
enum Decision
{
Exit the traverse operation
/**
* Exit the traverse operation
*/
EXIT,
Continue with the traverse operation
/**
* Continue with the traverse operation
*/
CONTINUE,
Remove the previously returned element from the Trie
and continue /**
* Remove the previously returned element
* from the {@link Trie} and continue
*/
REMOVE,
Remove the previously returned element from the Trie
and exit from the traverse operation /**
* Remove the previously returned element
* from the {@link Trie} and exit from the
* traverse operation
*/
REMOVE_AND_EXIT
}
Called for each Entry
in the Trie
. Return Decision.EXIT
to finish the Trie
operation, Decision.CONTINUE
to go to the next Entry
, Decision.REMOVE
to remove the Entry
and continue iterating or Decision.REMOVE_AND_EXIT
to remove the Entry
and stop iterating. Note: Not all operations support Decision.REMOVE
. /**
* Called for each {@link Entry} in the {@link Trie}. Return
* {@link Decision#EXIT} to finish the {@link Trie} operation,
* {@link Decision#CONTINUE} to go to the next {@link Entry},
* {@link Decision#REMOVE} to remove the {@link Entry} and
* continue iterating or {@link Decision#REMOVE_AND_EXIT} to
* remove the {@link Entry} and stop iterating.
*
* Note: Not all operations support {@link Decision#REMOVE}.
*/
Decision select(Map.Entry<? extends K, ? extends V> entry);
}