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 import javax.naming.NamingException;
23
24 import org.apache.directory.shared.ldap.filter.BranchNode;
25 import org.apache.directory.shared.ldap.filter.ExprNode;
26 import org.apache.directory.server.xdbm.search.Optimizer;
27
28
29 /**
30 * A do nothing optimizer which labels all nodes with <code>
31 * BigInteger.valueOf( Integer.MAX_VALUE ) </code>, instead of actually
32 * taking scan counts.
33 *
34 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
35 * @version $Rev$, $Date$
36 */
37 public class NoOpOptimizer implements Optimizer
38 {
39 /** the maximum size for a count Integer.MAX_VALUE as a BigInteger */
40 private static final Long MAX = Long.MAX_VALUE;
41
42 public Long annotate( ExprNode node ) throws NamingException
43 {
44 if ( node.isLeaf() )
45 {
46 node.set( "count", MAX );
47 return MAX;
48 }
49
50 BranchNode bnode = ( BranchNode ) node;
51 if ( bnode.getChildren().size() == 0 )
52 {
53 bnode.set( "count", MAX );
54 return MAX;
55 }
56
57 final int limit = bnode.getChildren().size();
58 for ( int ii = 0; ii < limit; ii++ )
59 {
60 ExprNode child = bnode.getChildren().get( ii );
61 if ( child.isLeaf() )
62 {
63 child.set( "count", MAX );
64 }
65 else
66 {
67 annotate( child );
68 }
69 }
70
71 bnode.set( "count", MAX );
72 return MAX;
73 }
74 }