KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > repository > test > PredicateExpressionTest


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.repository.test;
17
18 import org.outerj.daisy.repository.testsupport.AbstractDaisyTestCase;
19 import org.outerj.daisy.repository.acl.*;
20 import org.outerj.daisy.repository.*;
21 import org.outerj.daisy.repository.query.PredicateExpression;
22 import org.outerj.daisy.repository.user.Role;
23 import org.outerj.daisy.repository.schema.RepositorySchema;
24 import org.outerj.daisy.repository.schema.FieldType;
25 import org.outerj.daisy.repository.schema.DocumentType;
26
27 import java.math.BigDecimal JavaDoc;
28 import java.util.GregorianCalendar JavaDoc;
29
30 public class PredicateExpressionTest extends AbstractDaisyTestCase {
31     private Repository repository;
32
33     protected boolean resetDataStores() {
34         return true;
35     }
36
37     protected void setUp() throws Exception JavaDoc {
38         super.setUp();
39
40         RepositoryManager repositoryManager = getLocalRepositoryManager();
41
42         repository = repositoryManager.getRepository(new Credentials("testuser", "testuser"));
43         repository.switchRole(Role.ADMINISTRATOR);
44     }
45
46     public void testPredicateEvaluation() throws Exception JavaDoc {
47
48         // make sure the ACL doesn't get in our way
49
Acl acl = repository.getAccessManager().getStagingAcl();
50         AclObject aclObject = acl.createNewObject("true");
51         acl.add(aclObject);
52         AclEntry aclEntry = aclObject.createNewEntry(AclSubjectType.EVERYONE, -1);
53         aclEntry.set(AclPermission.READ, AclActionType.GRANT);
54         aclEntry.set(AclPermission.WRITE, AclActionType.GRANT);
55         aclObject.add(aclEntry);
56         acl.save();
57         repository.getAccessManager().copyStagingToLive();
58
59         CollectionManager collectionManager = repository.getCollectionManager();
60         DocumentCollection collection = collectionManager.createCollection("collection1");
61         collection.save();
62
63         RepositorySchema repositorySchema = repository.getRepositorySchema();
64
65         FieldType stringField = repositorySchema.createFieldType("stringfield", ValueType.STRING);
66         stringField.save();
67
68         FieldType longField = repositorySchema.createFieldType("longfield", ValueType.LONG);
69         longField.save();
70
71         FieldType doubleField = repositorySchema.createFieldType("doublefield", ValueType.DOUBLE);
72         doubleField.save();
73
74         FieldType decimalField = repositorySchema.createFieldType("decimalfield", ValueType.DECIMAL);
75         decimalField.save();
76
77         FieldType dateField = repositorySchema.createFieldType("datefield", ValueType.DATE);
78         dateField.save();
79
80         FieldType dateTimeField = repositorySchema.createFieldType("datetimefield", ValueType.DATETIME);
81         dateTimeField.save();
82
83         FieldType booleanField = repositorySchema.createFieldType("booleanfield", ValueType.BOOLEAN);
84         booleanField.save();
85
86         FieldType multiValueStringField = repositorySchema.createFieldType("mv-stringfield", ValueType.STRING, true);
87         multiValueStringField.save();
88
89         DocumentType documentType = repositorySchema.createDocumentType("doctype");
90         documentType.addFieldType(stringField, false);
91         documentType.addFieldType(longField, false);
92         documentType.addFieldType(doubleField, false);
93         documentType.addFieldType(decimalField, false);
94         documentType.addFieldType(dateField, false);
95         documentType.addFieldType(dateTimeField, false);
96         documentType.addFieldType(booleanField, false);
97         documentType.addFieldType(multiValueStringField, false);
98         documentType.save();
99
100         Document document = repository.createDocument("test", documentType.getId());
101         document.setField(stringField.getId(), "some value");
102         document.setField(longField.getId(), new Long JavaDoc(123));
103         document.setField(doubleField.getId(), new Double JavaDoc(123.45));
104         document.setField(decimalField.getId(), new BigDecimal JavaDoc("123.45678"));
105         document.setField(dateField.getId(), new GregorianCalendar JavaDoc(2004, 11, 6).getTime());
106         document.setField(dateTimeField.getId(), new GregorianCalendar JavaDoc(2004, 11, 6, 12, 15, 6).getTime());
107         document.setField(booleanField.getId(), Boolean.TRUE);
108         document.setField(multiValueStringField.getId(), new String JavaDoc[] {"value 1", "value 2"});
109
110         document.addToCollection(collection);
111         document.save();
112
113         PredicateExpression expr;
114
115         //
116
// Test various combinations of datatypes and operators
117
//
118

119         // string
120
expr = makeExpression("$stringfield = 'some value'");
121         assertEquals(true, expr.evaluate(document, null));
122         expr = makeExpression("$stringfield = 'some other value'");
123         assertEquals(false, expr.evaluate(document, null));
124         expr = makeExpression("$stringfield LIKE '%value'");
125         assertEquals(true, expr.evaluate(document, null));
126         expr = makeExpression("$stringfield LIKE 'some_value'");
127         assertEquals(true, expr.evaluate(document, null));
128         expr = makeExpression("$stringfield LIKE 'some\\_value'");
129         assertEquals(false, expr.evaluate(document, null));
130
131         // long
132
expr = makeExpression("$longfield = 123");
133         assertEquals(true, expr.evaluate(document, null));
134         expr = makeExpression("$longfield = 124");
135         assertEquals(false, expr.evaluate(document, null));
136
137         // double
138
expr = makeExpression("$doublefield < 124");
139         assertEquals(true, expr.evaluate(document, null));
140         expr = makeExpression("$doublefield > 122");
141         assertEquals(true, expr.evaluate(document, null));
142
143         // date
144
expr = makeExpression("$datefield = '2004-12-06'");
145         assertEquals(true, expr.evaluate(document, null));
146         expr = makeExpression("$datefield >= '2004-12-06'");
147         assertEquals(true, expr.evaluate(document, null));
148         expr = makeExpression("$datefield <= '2004-12-06'");
149         assertEquals(true, expr.evaluate(document, null));
150         expr = makeExpression("$datefield > '2004-12-05'");
151         assertEquals(true, expr.evaluate(document, null));
152         expr = makeExpression("$datefield != '2004-12-05'");
153         assertEquals(true, expr.evaluate(document, null));
154
155         // datetime
156
expr = makeExpression("$datetimefield = '2004-12-06 12:15:06'");
157         assertEquals(true, expr.evaluate(document, null));
158         expr = makeExpression("$datetimefield >= '2004-12-06 12:15:06'");
159         assertEquals(true, expr.evaluate(document, null));
160         expr = makeExpression("$datetimefield <= '2004-12-06 12:15:06'");
161         assertEquals(true, expr.evaluate(document, null));
162         expr = makeExpression("$datetimefield > '2004-12-05 12:15:06'");
163         assertEquals(true, expr.evaluate(document, null));
164         expr = makeExpression("$datetimefield != '2004-12-05 12:15:06'");
165         assertEquals(true, expr.evaluate(document, null));
166
167         // decimal
168
expr = makeExpression("$decimalfield IN (3232.3232, 123.45678, 890.542)");
169         assertEquals(true, expr.evaluate(document, null));
170         expr = makeExpression("$decimalfield IN (3232.3232, 890.542)");
171         assertEquals(false, expr.evaluate(document, null));
172         expr = makeExpression("$decimalfield NOT IN (3232.3232, 890.542)");
173         assertEquals(true, expr.evaluate(document, null));
174         expr = makeExpression("$decimalfield BETWEEN 89.232 AND 123.456789");
175         assertEquals(true, expr.evaluate(document, null));
176
177         // boolean
178
expr = makeExpression("$booleanfield = 'true'");
179         assertEquals(true, expr.evaluate(document, null));
180
181         //
182
// Test more complex expresions
183
//
184
expr = makeExpression("$decimalfield IN (3232.3232, 123.45678, 890.542) and $stringfield between 'a' and 'z'");
185         assertEquals(true, expr.evaluate(document, null));
186
187         expr = makeExpression("$decimalfield IN (5) or $stringfield between 'a' and 'z'");
188         assertEquals(true, expr.evaluate(document, null));
189
190         expr = makeExpression("($decimalfield IN (5) or $stringfield between 'a' and 'z') and $longfield > 100");
191         assertEquals(true, expr.evaluate(document, null));
192
193         //
194
// Test non-metadata fields
195
//
196
expr = makeExpression("documentType = '" + documentType.getName() + "'");
197         assertEquals(true, expr.evaluate(document, null));
198
199         expr = makeExpression("InCollection('" + collection.getName() + "')");
200         assertEquals(true, expr.evaluate(document, null));
201
202         //
203
// Test multivalue fields
204
//
205
expr = makeExpression("$mv-stringfield.valueCount = 2");
206         assertTrue(expr.evaluate(document, null));
207
208         expr = makeExpression("$mv-stringfield.valueCount > 1 and $mv-stringfield.valueCount < 3");
209         assertTrue(expr.evaluate(document, null));
210
211         expr = makeExpression("$mv-stringfield.valueCount != 2");
212         assertFalse(expr.evaluate(document, null));
213
214         expr = makeExpression("$mv-stringfield has all ('value 1')");
215         assertTrue(expr.evaluate(document, null));
216
217         expr = makeExpression("$mv-stringfield has all ('value 1', 'value 2')");
218         assertTrue(expr.evaluate(document, null));
219
220         expr = makeExpression("$mv-stringfield has exactly ('value 1')");
221         assertFalse(expr.evaluate(document, null));
222
223         expr = makeExpression("$mv-stringfield has exactly ('value 1', 'value 2')");
224         assertTrue(expr.evaluate(document, null));
225
226         expr = makeExpression("$mv-stringfield has any ('value 1', 'xyz')");
227         assertTrue(expr.evaluate(document, null));
228
229         expr = makeExpression("$mv-stringfield has some ('value 1', 'xyz')");
230         assertTrue(expr.evaluate(document, null));
231
232         expr = makeExpression("$mv-stringfield has some ('abc', 'xyz')");
233         assertFalse(expr.evaluate(document, null));
234
235         expr = makeExpression("$mv-stringfield has some ('value 1', 'value 2')");
236         assertTrue(expr.evaluate(document, null));
237
238         expr = makeExpression("$mv-stringfield = 'value 1'");
239         assertTrue(expr.evaluate(document, null));
240
241         expr = makeExpression("$mv-stringfield like 'value%'");
242         assertTrue(expr.evaluate(document, null));
243
244         // TODO test other functions like LinksTo
245
}
246
247     private PredicateExpression makeExpression(String JavaDoc expression) throws Exception JavaDoc{
248         return repository.getQueryManager().parsePredicateExpression(expression);
249     }
250 }
251
Popular Tags