1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 * 19 */ 20 package org.apache.directory.server.xdbm.search.impl; 21 22 23 import java.util.Comparator; 24 25 import org.apache.directory.server.xdbm.search.Evaluator; 26 27 28 /** 29 * A helper class used to compare scan counts. 30 * 31 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 32 */ 33 public class ScanCountComparator implements Comparator<Evaluator<?>> 34 { 35 /** 36 * Compare two scan counts frpm two evaluators 37 */ 38 public int compare( Evaluator<?> e1, Evaluator<?> e2 ) 39 { 40 Object count1 = e1.getExpression().get( DefaultOptimizer.COUNT_ANNOTATION ); 41 Object count2 = e2.getExpression().get( DefaultOptimizer.COUNT_ANNOTATION ); 42 long scanCount1 = Long.MAX_VALUE; 43 long scanCount2 = Long.MAX_VALUE; 44 45 if ( count1 != null ) 46 { 47 scanCount1 = ( Long ) e1.getExpression().get( DefaultOptimizer.COUNT_ANNOTATION ); 48 } 49 50 if ( count2 != null ) 51 { 52 scanCount2 = ( Long ) e2.getExpression().get( DefaultOptimizer.COUNT_ANNOTATION ); 53 } 54 55 if ( scanCount1 == scanCount2 ) 56 { 57 return 0; 58 } 59 60 /* 61 * We want the Evaluator with the smallest scan count first 62 * since this node has the highest probability of failing, or 63 * rather the least probability of succeeding. That way we 64 * can short the sub-expression evaluation process. 65 */ 66 if ( scanCount1 < scanCount2 ) 67 { 68 return -1; 69 } 70 71 return 1; 72 } 73 }