org.apache.activemq.store.kahadb.disk.index.BTreeVisitor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of activemq-osgi Show documentation
Show all versions of activemq-osgi Show documentation
Puts together an ActiveMQ OSGi bundle
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.activemq.store.kahadb.disk.index;
import java.util.List;
/**
* Interface used to selectively visit the entries in a BTree.
*
* @param
* @param
*/
public interface BTreeVisitor {
/**
* Do you want to visit the range of BTree entries between the first and and second key?
*
* @param first if null indicates the range of values before the second key.
* @param second if null indicates the range of values after the first key.
* @return true if you want to visit the values between the first and second key.
*/
boolean isInterestedInKeysBetween(Key first, Key second);
/**
* The keys and values of a BTree leaf node.
*
* @param keys
* @param values
*/
void visit(List keys, List values);
public interface Predicate {
boolean isInterestedInKeysBetween(Key first, Key second);
boolean isInterestedInKey(Key key);
}
abstract class PredicateVisitor implements BTreeVisitor, Predicate {
public void visit(List keys, List values) {
for( int i=0; i < keys.size(); i++) {
Key key = keys.get(i);
if( isInterestedInKey(key) ) {
matched(key, values.get(i));
}
}
}
protected void matched(Key key, Value value) {
}
}
class OrVisitor extends PredicateVisitor {
private final List> conditions;
public OrVisitor(List> conditions) {
this.conditions = conditions;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
for (Predicate condition : conditions) {
if( condition.isInterestedInKeysBetween(first, second) ) {
return true;
}
}
return false;
}
public boolean isInterestedInKey(Key key) {
for (Predicate condition : conditions) {
if( condition.isInterestedInKey(key) ) {
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
boolean first=true;
for (Predicate condition : conditions) {
if( !first ) {
sb.append(" OR ");
}
first=false;
sb.append("(");
sb.append(condition);
sb.append(")");
}
return sb.toString();
}
}
class AndVisitor extends PredicateVisitor {
private final List> conditions;
public AndVisitor(List> conditions) {
this.conditions = conditions;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
for (Predicate condition : conditions) {
if( !condition.isInterestedInKeysBetween(first, second) ) {
return false;
}
}
return true;
}
public boolean isInterestedInKey(Key key) {
for (Predicate condition : conditions) {
if( !condition.isInterestedInKey(key) ) {
return false;
}
}
return true;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
boolean first=true;
for (Predicate condition : conditions) {
if( !first ) {
sb.append(" AND ");
}
first=false;
sb.append("(");
sb.append(condition);
sb.append(")");
}
return sb.toString();
}
}
class BetweenVisitor, Value> extends PredicateVisitor {
private final Key first;
private final Key last;
public BetweenVisitor(Key first, Key last) {
this.first = first;
this.last = last;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
return (second==null || second.compareTo(this.first)>=0)
&& (first==null || first.compareTo(last)<0);
}
public boolean isInterestedInKey(Key key) {
return key.compareTo(first) >=0 && key.compareTo(last) <0;
}
@Override
public String toString() {
return first+" <= key < "+last;
}
}
class GTVisitor, Value> extends PredicateVisitor {
final private Key value;
public GTVisitor(Key value) {
this.value = value;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
return second==null || second.compareTo(value)>0;
}
public boolean isInterestedInKey(Key key) {
return key.compareTo(value)>0;
}
@Override
public String toString() {
return "key > "+ value;
}
}
class GTEVisitor, Value> extends PredicateVisitor {
final private Key value;
public GTEVisitor(Key value) {
this.value = value;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
return second==null || second.compareTo(value)>=0;
}
public boolean isInterestedInKey(Key key) {
return key.compareTo(value)>=0;
}
@Override
public String toString() {
return "key >= "+ value;
}
}
class LTVisitor, Value> extends PredicateVisitor {
final private Key value;
public LTVisitor(Key value) {
this.value = value;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
return first==null || first.compareTo(value)<0;
}
public boolean isInterestedInKey(Key key) {
return key.compareTo(value)<0;
}
@Override
public String toString() {
return "key < "+ value;
}
}
class LTEVisitor, Value> extends PredicateVisitor {
final private Key value;
public LTEVisitor(Key value) {
this.value = value;
}
public boolean isInterestedInKeysBetween(Key first, Key second) {
return first==null || first.compareTo(value)<=0;
}
public boolean isInterestedInKey(Key key) {
return key.compareTo(value)<=0;
}
@Override
public String toString() {
return "key <= "+ value;
}
}
}