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.impl;
21
22
23 import javax.naming.directory.SearchControls;
24
25 import org.apache.directory.shared.ldap.filter.AndNode;
26 import org.apache.directory.shared.ldap.filter.BranchNode;
27 import org.apache.directory.shared.ldap.filter.ExprNode;
28 import org.apache.directory.shared.ldap.filter.ScopeNode;
29 import org.apache.directory.shared.ldap.filter.SearchScope;
30 import org.apache.directory.shared.ldap.message.AliasDerefMode;
31 import org.apache.directory.shared.ldap.name.LdapDN;
32 import org.apache.directory.server.xdbm.*;
33 import org.apache.directory.server.xdbm.search.Optimizer;
34 import org.apache.directory.server.xdbm.search.SearchEngine;
35 import org.apache.directory.server.xdbm.search.Evaluator;
36 import org.apache.directory.server.core.entry.ServerEntry;
37
38
39
40
41
42
43
44
45
46 public class DefaultSearchEngine implements SearchEngine<ServerEntry>
47 {
48
49 private final Optimizer optimizer;
50
51 private final Store<ServerEntry> db;
52
53 private final CursorBuilder cursorBuilder;
54
55 private final EvaluatorBuilder evaluatorBuilder;
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public DefaultSearchEngine( Store<ServerEntry> db,
72 CursorBuilder cursorBuilder, EvaluatorBuilder evaluatorBuilder, Optimizer optimizer )
73 {
74 this.db = db;
75 this.optimizer = optimizer;
76 this.cursorBuilder = cursorBuilder;
77 this.evaluatorBuilder = evaluatorBuilder;
78 }
79
80
81
82
83
84
85
86 public Optimizer getOptimizer()
87 {
88 return optimizer;
89 }
90
91
92
93
94
95 public IndexCursor<Long,ServerEntry> cursor( LdapDN base, AliasDerefMode aliasDerefMode, ExprNode filter,
96 SearchControls searchCtls ) throws Exception
97 {
98 LdapDN effectiveBase;
99 Long baseId = db.getEntryId( base.toString() );
100 String aliasedBase = db.getAliasIndex().reverseLookup( baseId );
101
102
103
104
105
106
107
108
109
110
111 if ( ( null == aliasedBase ) || ! aliasDerefMode.isDerefFindingBase() )
112 {
113 effectiveBase = base;
114 }
115
116
117
118
119
120
121 else
122 {
123 effectiveBase = new LdapDN( aliasedBase );
124 }
125
126
127
128
129
130 if ( searchCtls.getSearchScope() == SearchControls.OBJECT_SCOPE )
131 {
132 Long effectiveBaseId = baseId;
133 if ( effectiveBase != base )
134 {
135 effectiveBaseId = db.getEntryId( effectiveBase.toNormName() );
136 }
137
138 IndexEntry<Long, ServerEntry> indexEntry = new ForwardIndexEntry<Long, ServerEntry>();
139 indexEntry.setId( effectiveBaseId );
140 optimizer.annotate( filter );
141 Evaluator<? extends ExprNode, ServerEntry> evaluator = evaluatorBuilder.build( filter );
142
143 if ( evaluator.evaluate( indexEntry ) )
144 {
145 return new SingletonIndexCursor<Long,ServerEntry>( indexEntry );
146 }
147 else
148 {
149 return new EmptyIndexCursor<Long, ServerEntry>();
150 }
151 }
152
153
154 BranchNode root = new AndNode();
155 ExprNode node = new ScopeNode( aliasDerefMode, effectiveBase.toString(),
156 SearchScope.getSearchScope( searchCtls ) );
157 root.getChildren().add( node );
158 root.getChildren().add( filter );
159
160
161 optimizer.annotate( root );
162 return ( IndexCursor<Long, ServerEntry> ) cursorBuilder.build( root );
163 }
164
165
166
167
168
169 public Evaluator<? extends ExprNode, ServerEntry> evaluator( ExprNode filter )
170 throws Exception
171 {
172 return evaluatorBuilder.build( filter );
173 }
174 }