1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.xdbm.search.evaluator;
21
22
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.List;
26
27 import org.apache.directory.api.ldap.model.entry.Entry;
28 import org.apache.directory.api.ldap.model.exception.LdapException;
29 import org.apache.directory.api.ldap.model.filter.AndNode;
30 import org.apache.directory.api.ldap.model.filter.ExprNode;
31 import org.apache.directory.server.core.api.partition.PartitionTxn;
32 import org.apache.directory.server.xdbm.IndexEntry;
33 import org.apache.directory.server.xdbm.search.Evaluator;
34 import org.apache.directory.server.xdbm.search.impl.ScanCountComparator;
35
36
37
38
39
40
41
42 public class AndEvaluator implements Evaluator<AndNode>
43 {
44
45 private final List<Evaluator<? extends ExprNode>> evaluators;
46
47
48 private final AndNode node;
49
50
51
52
53
54
55
56 public AndEvaluator( AndNode node, List<Evaluator<? extends ExprNode>> evaluators )
57 {
58 this.node = node;
59 this.evaluators = optimize( evaluators );
60 }
61
62
63
64
65
66
67
68
69
70
71
72
73
74 private List<Evaluator<? extends ExprNode>> optimize(
75 List<Evaluator<? extends ExprNode>> unoptimized )
76 {
77 switch ( unoptimized.size() )
78 {
79 case 0 :
80 case 1 :
81 return unoptimized;
82
83 case 2 :
84 Object count1 = unoptimized.get( 0 ).getExpression().get( "count" );
85 Object count2 = unoptimized.get( 1 ).getExpression().get( "count" );
86
87 if ( count1 == null )
88 {
89 if ( count2 != null )
90 {
91 unoptimized.add( unoptimized.remove( 0 ) );
92 }
93 }
94 else
95 {
96 if ( ( count2 != null ) && ( ( Long ) count1 > ( Long ) count2 ) )
97 {
98 unoptimized.add( unoptimized.remove( 0 ) );
99 }
100 }
101
102 return unoptimized;
103
104 default :
105 List<Evaluator<? extends ExprNode>> optimized = new ArrayList<>(
106 unoptimized.size() );
107 optimized.addAll( unoptimized );
108
109 Collections.sort( optimized, new ScanCountComparator() );
110
111 return optimized;
112 }
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146 }
147
148
149
150
151
152 public boolean evaluate( Entry entry ) throws LdapException
153 {
154 for ( Evaluator<?> evaluator : evaluators )
155 {
156 if ( !evaluator.evaluate( entry ) )
157 {
158 return false;
159 }
160 }
161
162 return true;
163 }
164
165
166
167
168
169 public boolean evaluate( PartitionTxn partitionTxn, IndexEntry<?, String> indexEntry ) throws LdapException
170 {
171 for ( Evaluator<?> evaluator : evaluators )
172 {
173 if ( !evaluator.evaluate( partitionTxn, indexEntry ) )
174 {
175 return false;
176 }
177 }
178
179 return true;
180 }
181
182
183
184
185
186 public AndNode getExpression()
187 {
188 return node;
189 }
190
191
192
193
194
195 private String dumpEvaluators( String tabs )
196 {
197 StringBuilder sb = new StringBuilder();
198
199 for ( Evaluator<? extends ExprNode> evaluator : evaluators )
200 {
201 sb.append( evaluator.toString( tabs + " " ) );
202 }
203
204 return sb.toString();
205 }
206
207
208
209
210
211 public String toString( String tabs )
212 {
213 StringBuilder sb = new StringBuilder();
214
215 sb.append( tabs ).append( "AndEvaluator : " ).append( node ).append( "\n" );
216
217 if ( ( evaluators != null ) && !evaluators.isEmpty() )
218 {
219 sb.append( dumpEvaluators( tabs + " " ) ).append( "\n" );
220 }
221
222 return sb.toString();
223 }
224
225
226
227
228
229 public String toString()
230 {
231 return toString( "" );
232 }
233 }