KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > ojb > broker > query > CriteriaUtils


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

17
18 import java.util.*;
19
20 /**
21  * This Class contains utility functions for Criterias.
22  *
23  * @author <a HREF="mailto:on@ibis.odessa.ua">Oleg Nitz</a>
24  * @version $Id: CriteriaUtils.java,v 1.5.2.1 2005/12/21 22:27:09 tomdz Exp $
25  */

26 public class CriteriaUtils
27 {
28
29     /**
30      * Disjunctive Normal Form: list of Criteria, which don't contain ORs,
31      * the elements of the list joined by ORs give the condition equivalent
32      * to the original Criteria.
33      */

34     public static List getDNF(Criteria crit)
35     {
36         List dnf = new ArrayList();
37         Enumeration e = crit.getElements();
38         Criteria tmpCrit;
39
40         while (e.hasMoreElements())
41         {
42             Object JavaDoc o = e.nextElement();
43             if (o instanceof Criteria)
44             {
45                 Criteria pc = (Criteria) o;
46                 switch (pc.getType())
47                 {
48                     case (Criteria.OR):
49                         {
50                             dnf.addAll(getDNF(pc));
51                             break;
52                         }
53                     case (Criteria.AND):
54                         {
55                             dnf = getDnfAndDnf(dnf, getDNF(pc));
56                             break;
57                         }
58                 }
59             }
60             else
61             {
62                 SelectionCriteria c = (SelectionCriteria) o;
63                 tmpCrit = new Criteria();
64                 tmpCrit.getCriteria().add(c);
65                 if (dnf.isEmpty())
66                 {
67                     dnf.add(tmpCrit);
68                 }
69                 else
70                 {
71 //#ifdef JDK13
72
dnf = getDnfAndDnf(dnf, Collections.singletonList(tmpCrit));
73 //#else
74
/*
75                     Vector singletonList = new Vector(1);
76                     singletonList.add(tmpCrit);
77                     dnf = getDnfAndDnf(dnf,singletonList);
78
79 */

80 //#endif
81

82                     
83                 }
84             }
85         } // while
86

87         return dnf;
88     }
89
90     /**
91      * (a OR b) AND (c OR d) -> (a AND c) OR (a AND d) OR (b AND c) OR (b AND d)
92      */

93     private static List getDnfAndDnf(List dnf1, List dnf2)
94     {
95         ArrayList dnf = new ArrayList();
96
97         for (Iterator it1 = dnf1.iterator(); it1.hasNext(); )
98         {
99             Criteria crit1 = (Criteria) it1.next();
100
101             for (Iterator it2 = dnf2.iterator(); it2.hasNext(); )
102             {
103                 Criteria crit2 = (Criteria) it2.next();
104                 Criteria crit = new Criteria();
105                 crit.getCriteria().addAll(crit1.getCriteria());
106                 crit.getCriteria().addAll(crit2.getCriteria());
107                 dnf.add(crit);
108             }
109         }
110
111         return dnf;
112     }
113 }
114
115
Popular Tags