1 martin 1.11 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.12 //
|
3 martin 1.11 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.12 //
|
10 martin 1.11 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.12 //
|
17 martin 1.11 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.12 //
|
20 martin 1.11 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.12 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.11 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.12 //
|
28 martin 1.11 //////////////////////////////////////////////////////////////////////////
|
29 chuck 1.2 //
30 //
31 //%/////////////////////////////////////////////////////////////////////////////
32
33 #include <Pegasus/Common/InternalException.h>
34 #include "CQLPredicate.h"
35 #include "CQLSimplePredicate.h"
36 #include "CQLPredicateRep.h"
37 #include <Pegasus/CQL/CQLFactory.h>
38 #include <Pegasus/Query/QueryCommon/QueryContext.h>
|
39 humberto 1.3 #include <Pegasus/Common/Tracer.h>
|
40 chuck 1.2
41 PEGASUS_NAMESPACE_BEGIN
42
43 CQLPredicateRep::CQLPredicateRep():
|
44 karl 1.10 _invert(false)
|
45 chuck 1.2 {
46
47 }
48
|
49 karl 1.10 CQLPredicateRep::CQLPredicateRep(const CQLSimplePredicate& inSimplePredicate,
50 Boolean inVerted) :
51 _simplePredicate(inSimplePredicate), _invert(inVerted)
|
52 chuck 1.2 {
|
53 humberto 1.5
|
54 chuck 1.2 }
55
|
56 kumpf 1.13 CQLPredicateRep::CQLPredicateRep(const CQLPredicate& inPredicate,
|
57 karl 1.10 Boolean inInverted) :
58 _invert(inInverted)
|
59 chuck 1.2 {
|
60 karl 1.10 _predicates.append(inPredicate);
|
61 chuck 1.2 }
62
63 CQLPredicateRep::CQLPredicateRep(const CQLPredicateRep* rep):
|
64 karl 1.10 _invert(false)
|
65 chuck 1.2 {
|
66 karl 1.10 _predicates = rep->_predicates;
67 _simplePredicate = rep->_simplePredicate;
68 _operators = rep->_operators;
69 _invert = rep->_invert;
|
70 chuck 1.2 }
71
72 Boolean CQLPredicateRep::evaluate(CIMInstance CI, QueryContext& QueryCtx)
73 {
|
74 karl 1.10 PEG_METHOD_ENTER(TRC_CQL, "CQLIPredicateRep::evaluate");
75 Boolean result = false;
|
76 kumpf 1.13
|
77 karl 1.10 if (isSimple())
78 {
|
79 chuck 1.2 result = _simplePredicate.evaluate(CI, QueryCtx);
|
80 karl 1.10 }
81 else
82 {
83 result = _predicates[0].evaluate(CI, QueryCtx);
84 for (Uint32 i = 0; i < _operators.size(); i++)
|
85 chuck 1.2 {
|
86 karl 1.10 if (_operators[i] == AND)
87 {
88 if(result)
89 {
90 result = _predicates[i+1].evaluate(CI, QueryCtx);
91 }
92 }
93 else
94 {
95 if(result)
96 {
97 break;
98 }
99 else
100 {
101 result = _predicates[i+1].evaluate(CI, QueryCtx);
102 }
103 }
|
104 chuck 1.2 }
|
105 karl 1.10 }
106 PEG_METHOD_EXIT();
107 return (getInverted()) ? !result : result;
|
108 chuck 1.2 }
109
110 Boolean CQLPredicateRep::getInverted()const{
|
111 karl 1.10 return _invert;
|
112 chuck 1.2 }
113
|
114 humberto 1.6 void CQLPredicateRep::setInverted(Boolean invert){
|
115 karl 1.10 _invert = invert;
|
116 chuck 1.2 }
117
118 void CQLPredicateRep::appendPredicate(const CQLPredicate& inPredicate){
|
119 karl 1.10 _predicates.append(inPredicate);
|
120 chuck 1.2 }
121
|
122 karl 1.10 void CQLPredicateRep::appendPredicate(const CQLPredicate& inPredicate,
123 BooleanOpType inBooleanOperator)
|
124 chuck 1.2 {
|
125 karl 1.10 _predicates.append(inPredicate);
126 _operators.append(inBooleanOperator);
|
127 chuck 1.2 }
128
129 Array<CQLPredicate> CQLPredicateRep::getPredicates()const{
|
130 karl 1.10 return _predicates;
|
131 chuck 1.2 }
132
133 CQLSimplePredicate CQLPredicateRep::getSimplePredicate()const{
|
134 karl 1.10 return _simplePredicate;
|
135 chuck 1.2 }
136
137 Array<BooleanOpType> CQLPredicateRep::getOperators()const{
|
138 karl 1.10 return _operators;
|
139 chuck 1.2 }
140
|
141 vijay.eli 1.8 void CQLPredicateRep::applyContext(const QueryContext& queryContext)
|
142 chuck 1.2 {
|
143 karl 1.10 PEG_METHOD_ENTER(TRC_CQL, "CQLPredicateRep::applyContext");
144 if (isSimple())
145 {
146 _simplePredicate.applyContext(queryContext);
147 }
148 else
|
149 chuck 1.2 {
|
150 karl 1.10 for (Uint32 i = 0; i <_predicates.size(); i++)
151 {
152 _predicates[i].applyContext(queryContext);
153 }
|
154 chuck 1.2 }
|
155 karl 1.10 PEG_METHOD_EXIT();
|
156 chuck 1.2 }
157
158 Boolean CQLPredicateRep::isSimple()const{
|
159 karl 1.10 return (_predicates.size() == 0);
|
160 chuck 1.2 }
161
162 Boolean CQLPredicateRep::isSimpleValue()const{
|
163 karl 1.10 return (isSimple() && _simplePredicate.isSimpleValue());
|
164 chuck 1.2 }
165
166 String CQLPredicateRep::toString()const{
|
167 karl 1.10 if(isSimple())
168 {
169 String s;
|
170 humberto 1.5 if(_invert) s = "NOT ";
171 s.append(_simplePredicate.toString());
172 return s;
|
173 karl 1.10 }
174 String s;
175 if(_invert) s = "NOT ";
176 for(Uint32 i = 0; i < _predicates.size(); i++)
177 {
178 s.append(_predicates[i].toString());
179 if(i < _operators.size())
180 {
181 switch(_operators[i])
182 {
183 case AND: s.append(" AND ");
184 break;
185 case OR: s.append(" OR ");
186 break;
187 }
188 }
189 }
190 return s;
|
191 chuck 1.2 }
192
193 PEGASUS_NAMESPACE_END
|