(file) Return to CMPI_Wql2Dnf.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

  1 karl  1.14 //%2006////////////////////////////////////////////////////////////////////////
  2 schuur 1.1  //
  3 karl   1.8  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 schuur 1.1  // IBM Corp.; EMC Corporation, The Open Group.
  7 karl   1.8  // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl   1.11 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 karl   1.14 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12             // EMC Corporation; Symantec Corporation; The Open Group.
 13 schuur 1.1  //
 14             // Permission is hereby granted, free of charge, to any person obtaining a copy
 15             // of this software and associated documentation files (the "Software"), to
 16             // deal in the Software without restriction, including without limitation the
 17             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18             // sell copies of the Software, and to permit persons to whom the Software is
 19             // furnished to do so, subject to the following conditions:
 20 karl   1.8  // 
 21 schuur 1.1  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22             // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23             // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24             // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25             // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26             // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27             // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28             // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29             //
 30             //==============================================================================
 31             //
 32             //%/////////////////////////////////////////////////////////////////////////////
 33             
 34             
 35 schuur 1.6  #include "CMPI_Version.h"
 36 schuur 1.1  
 37             #include <Pegasus/Common/Stack.h>
 38             #include <Pegasus/WQL/WQLParser.h>
 39 chuck  1.9  #include <Pegasus/WQL/WQLSelectStatementRep.h>
 40 ms.aruran 1.18 #include <Pegasus/Common/Tracer.h>
 41 schuur    1.1  
 42                #include "CMPI_Wql2Dnf.h"
 43                
 44 schuur    1.4  PEGASUS_USING_STD;
 45 schuur    1.1  PEGASUS_NAMESPACE_BEGIN
 46                
 47                //
 48                // Terminal element methods 
 49                //
 50 konrad.r  1.10 void term_el_WQL::negate(void)
 51 schuur    1.1  {
 52 venkat.puvvada 1.17     switch( op )
 53 schuur         1.1      {
 54 venkat.puvvada 1.17         case WQL_EQ: op = WQL_NE;
 55                                 break;
 56                             case WQL_NE: op = WQL_EQ;
 57                                 break;
 58                             case WQL_LT: op = WQL_GE;
 59                                 break;
 60                             case WQL_LE: op = WQL_GT;
 61                                 break;
 62                             case WQL_GT: op = WQL_LE;
 63                                 break;
 64                             case WQL_GE: op = WQL_LT;
 65                                 break;
 66                             default:
 67                                 break;
 68 schuur         1.1      }
 69                     };
 70 mike           1.16 
 71 schuur         1.1  static bool operator==(const WQLOperand& x, const WQLOperand& y)
 72                     {
 73 venkat.puvvada 1.17     if( x.getType()==y.getType() )
 74                         {
 75                             switch( x.getType() )
 76                             {
 77                                 case WQLOperand::PROPERTY_NAME:
 78                                     return x.getPropertyName()==y.getPropertyName();
 79                                 case WQLOperand::INTEGER_VALUE:
 80                                     return x.getIntegerValue()==y.getIntegerValue();
 81                                 case WQLOperand::DOUBLE_VALUE:
 82                                     return x.getDoubleValue()==y.getDoubleValue();
 83                                 case WQLOperand::BOOLEAN_VALUE:
 84                                     return x.getBooleanValue()==y.getBooleanValue();
 85                                 case WQLOperand::STRING_VALUE:
 86                                     return x.getStringValue()==y.getStringValue();
 87                                 case WQLOperand::NULL_VALUE: 
 88                                     return true;
 89                             }
 90                         }
 91                         return false;
 92 schuur         1.1  }
 93                     
 94 konrad.r       1.10 static bool operator==(const term_el_WQL& x, const term_el_WQL& y)
 95 schuur         1.1  {
 96 venkat.puvvada 1.17     return x.op == y.op && 
 97                         x.opn1 == y.opn1 && 
 98                         x.opn2 == y.opn2;
 99 schuur         1.1  }
100                     
101 konrad.r       1.10 static void addIfNotExists(TableauRow_WQL &tr, const term_el_WQL& el)
102 schuur         1.1  {
103 ms.aruran      1.18     PEG_METHOD_ENTER(
104                             TRC_CMPIPROVIDERINTERFACE,
105                             "CMPI_Wql2Dnf:addIfNotExists()");
106 venkat.puvvada 1.17     for( int i=0,m=tr.size(); i<m; i++ )
107                         {
108                             if( tr[i]==el )
109                             {
110 ms.aruran      1.18             PEG_METHOD_EXIT();
111 venkat.puvvada 1.17             return;
112                             }
113                         }
114                         tr.append(el);
115 ms.aruran      1.18     PEG_METHOD_EXIT();
116 schuur         1.1  }
117                     
118 konrad.r       1.10 CMPI_Wql2Dnf::CMPI_Wql2Dnf(const String &condition, const String &pref) 
119 schuur         1.1  {
120                         WQLSelectStatement wqs;
121                         WQLParser::parse(pref+condition,wqs);
122                         eval_heap.reserveCapacity(16);
123                         terminal_heap.reserveCapacity(16);
124                         _tableau.clear();
125                         compile(&wqs);
126                     }
127                     
128                     CMPI_Wql2Dnf::CMPI_Wql2Dnf() 
129                     {
130                         eval_heap.reserveCapacity(16);
131                         terminal_heap.reserveCapacity(16);
132                         _tableau.clear();
133                     }
134                     
135 venkat.puvvada 1.17 CMPI_Wql2Dnf::~CMPI_Wql2Dnf()
136                     {
137                     }
138 schuur         1.1  
139                     void CMPI_Wql2Dnf::compile(const WQLSelectStatement * wqs)
140                     {
141 ms.aruran      1.18     PEG_METHOD_ENTER(TRC_CMPIPROVIDERINTERFACE, "CMPI_Wql2Dnf::compile()");
142 venkat.puvvada 1.17     if( !wqs->hasWhereClause() )
143                         {
144 ms.aruran      1.18         PEG_METHOD_EXIT();
145 venkat.puvvada 1.17         return;
146                         }
147 schuur         1.1      _tableau.clear();
148                     
149                         _buildEvalHeap(wqs);
150                         _pushNOTDown();
151                         _factoring();
152 venkat.puvvada 1.17 
153 mike           1.16     Array<CMPI_stack_el> disj;
154 schuur         1.1      _gatherDisj(disj);
155 venkat.puvvada 1.17     if( disj.size() == 0 )
156                         {
157                             if( terminal_heap.size() > 0 )
158                             {
159                                 // point to the remaining terminal element
160 mike           1.16             disj.append(CMPI_stack_el(0,true));
161 venkat.puvvada 1.17         }
162                         }
163 schuur         1.1  
164 venkat.puvvada 1.17     for( Uint32 i=0, n =disj.size(); i< n; i++ )
165 schuur         1.1      {
166 konrad.r       1.10         TableauRow_WQL tr;
167 mike           1.16         Array<CMPI_stack_el> conj;
168 schuur         1.1  
169 venkat.puvvada 1.17         if( !disj[i].is_terminal )
170 schuur         1.1          {
171 venkat.puvvada 1.17             _gatherConj(conj, disj[i]);
172                                 for( Uint32 j=0, m = conj.size(); j < m; j++ )
173                                 {
174                                     addIfNotExists(tr,terminal_heap[conj[j].opn]);
175                     //               tr.append(terminal_heap[conj[j].opn]);
176                                 }
177 schuur         1.1          }
178                             else
179 venkat.puvvada 1.17         {
180                                 addIfNotExists(tr,terminal_heap[disj[i].opn]);
181                     //          tr.append(terminal_heap[disj[i].opn]);
182                             }
183 schuur         1.1          _tableau.append(tr);
184                         }
185                     
186                         eval_heap.clear();
187 venkat.puvvada 1.17 
188                         _populateTableau();
189 ms.aruran      1.18     PEG_METHOD_EXIT();
190 schuur         1.1  }
191                     
192 venkat.puvvada 1.17 String WQL2String(const WQLOperand &o)
193                     {
194                         switch( o.getType() )
195                         {
196                             case WQLOperand::PROPERTY_NAME:
197                                 return o.getPropertyName();
198                             case WQLOperand::STRING_VALUE:
199                                 return o.getStringValue();
200                             case WQLOperand::INTEGER_VALUE:
201                                 return Formatter::format("$0",o.getIntegerValue());
202                             case WQLOperand::DOUBLE_VALUE:
203                                 return Formatter::format("$0",o.getDoubleValue());
204                             case WQLOperand::BOOLEAN_VALUE:
205                                 return Formatter::format("$0",o.getBooleanValue());
206                             default: ;
207                         }
208                         return "NULL_VALUE";
209 konrad.r       1.10 }
210                     
211 venkat.puvvada 1.17 CMPIPredOp WQL2PredOp(const WQLOperation &op)
212                     {
213 ms.aruran      1.18     PEG_METHOD_ENTER(TRC_CMPIPROVIDERINTERFACE,"CMPI_Wql2Dnf:WQL2PredOp()");
214 venkat.puvvada 1.17     static CMPIPredOp ops[]={(CMPIPredOp)0,(CMPIPredOp)0,(CMPIPredOp)0,
215                             CMPI_PredOp_Equals,
216                             CMPI_PredOp_NotEquals,
217                             CMPI_PredOp_LessThan,
218                             CMPI_PredOp_LessThanOrEquals,
219                             CMPI_PredOp_GreaterThan,
220                             CMPI_PredOp_GreaterThanOrEquals,
221                             (CMPIPredOp)0,(CMPIPredOp)0,(CMPIPredOp)0,
222                             (CMPIPredOp)0,(CMPIPredOp)0,(CMPIPredOp)0};
223 ms.aruran      1.18     PEG_METHOD_EXIT();
224 venkat.puvvada 1.17     return ops[(int)op];
225 konrad.r       1.10 }
226                     
227 venkat.puvvada 1.17 CMPI_QueryOperand::Type WQL2Type(WQLOperand::Type typ)
228                     {
229                         switch( typ )
230                         {
231                             case WQLOperand::PROPERTY_NAME:
232                                 return CMPI_QueryOperand::PROPERTY_TYPE;
233                             case WQLOperand::STRING_VALUE:
234                                 return CMPI_QueryOperand::STRING_TYPE;
235                             case WQLOperand::INTEGER_VALUE:
236                                 return CMPI_QueryOperand::UINT64_TYPE;
237                             case WQLOperand::DOUBLE_VALUE:
238                                 return CMPI_QueryOperand::REAL_TYPE;
239                             case WQLOperand::BOOLEAN_VALUE:
240                                 return CMPI_QueryOperand::BOOLEAN_TYPE;
241                             case WQLOperand::NULL_VALUE:
242                                 return CMPI_QueryOperand::NULL_TYPE;
243                         }
244                         return CMPI_QueryOperand::NULL_TYPE;
245 konrad.r       1.10 }
246                     
247                     
248                     void CMPI_Wql2Dnf::_populateTableau(void)
249                     {
250 ms.aruran      1.18     PEG_METHOD_ENTER(
251                             TRC_CMPIPROVIDERINTERFACE,
252                             "CMPI_Wql2Dnf::_populateTableau()");
253 venkat.puvvada 1.17     for( Uint32 i=0,n = _tableau.size(); i < n; i++ )
254                         {
255                             TableauRow_WQL tr_wql = _tableau[i];
256                     
257                             for( Uint32 j=0,m = tr_wql.size(); j < m; j++ )
258                             {
259                                 term_el_WQL t = tr_wql[j]; 
260 konrad.r       1.10 
261 venkat.puvvada 1.17             CMPI_TableauRow tr;
262                                 CMPI_QueryOperand lhs(WQL2String(t.opn1),
263                                 WQL2Type(t.opn1.getType()));
264                                 CMPI_QueryOperand rhs(WQL2String(t.opn2), 
265                                 WQL2Type(t.opn2.getType()));
266 konrad.r       1.10 
267 venkat.puvvada 1.17             tr.append(CMPI_term_el(t.mark, WQL2PredOp(t.op), lhs, rhs));
268                                 _CMPI_tableau.append (tr);
269 konrad.r       1.10 
270 venkat.puvvada 1.17         }
271                     
272                         }
273 ms.aruran      1.18     PEG_METHOD_EXIT();
274 konrad.r       1.10 }
275 schuur         1.1  void CMPI_Wql2Dnf::_buildEvalHeap(const WQLSelectStatement * wqs)
276                     {
277 ms.aruran      1.18     PEG_METHOD_ENTER(
278                             TRC_CMPIPROVIDERINTERFACE,
279                             "CMPI_Wql2Dnf::_buildEvalHeap()");
280 schuur         1.1      //WQLSelectStatement* that = (WQLSelectStatement*)wqs;
281                     
282 chuck          1.9      WQLSelectStatementRep* wqsrep = wqs->_rep;
283                     
284 schuur         1.1      WQLOperand dummy;
285                         dummy.clear();
286 mike           1.16     Stack<CMPI_stack_el> stack;
287 schuur         1.3  
288 schuur         1.1      // Counter for Operands
289                     
290                         Uint32 j = 0;
291                     
292                         //cerr << "Build eval heap\n";
293                     
294 venkat.puvvada 1.17     for( Uint32 i = 0, n = wqsrep->_operations.size(); i < n; i++ )
295 schuur         1.1      {
296 chuck          1.9          WQLOperation op = wqsrep->_operations[i];
297 schuur         1.1  
298 venkat.puvvada 1.17         switch( op )
299 schuur         1.1          {
300                                 case WQL_OR:
301                                 case WQL_AND:
302 venkat.puvvada 1.17                 {
303                                         PEGASUS_ASSERT(stack.size() >= 2);
304 schuur         1.1  
305 venkat.puvvada 1.17                     CMPI_stack_el op1 = stack.top();
306                                         stack.pop();
307 schuur         1.1  
308 venkat.puvvada 1.17                     CMPI_stack_el op2 = stack.top();
309 schuur         1.1  
310 venkat.puvvada 1.17                     // generate Eval expression
311                                         eval_heap.append(CMPI_eval_el(
312                                                              0, op , op1.opn,
313                                                              op1.is_terminal,op2.opn ,
314                                                              op2.is_terminal));
315 schuur         1.1  
316 venkat.puvvada 1.17                     stack.top() = CMPI_stack_el(eval_heap.size()-1, false);
317 schuur         1.1  
318 venkat.puvvada 1.17                     break;
319                                     }
320 schuur         1.1  
321                                 case WQL_NOT:
322                                 case WQL_IS_FALSE:
323                                 case WQL_IS_NOT_TRUE:
324 venkat.puvvada 1.17                 {
325                                         PEGASUS_ASSERT(stack.size() >= 1);
326 schuur         1.1  
327 venkat.puvvada 1.17                     CMPI_stack_el op1 = stack.top();
328 schuur         1.1  
329 venkat.puvvada 1.17                     // generate Eval expression
330                                         eval_heap.append(CMPI_eval_el(
331                                                              0, op , op1.opn, 
332                                                              op1.is_terminal,-1, true));
333 schuur         1.1  
334 venkat.puvvada 1.17                     stack.top() = CMPI_stack_el(eval_heap.size()-1, false);
335 schuur         1.1  
336 venkat.puvvada 1.17                     break;
337                                     }
338 schuur         1.1  
339                                 case WQL_EQ:
340                                 case WQL_NE:
341                                 case WQL_LT:
342                                 case WQL_LE:
343                                 case WQL_GT:
344                                 case WQL_GE:
345 venkat.puvvada 1.17                 {
346                                         PEGASUS_ASSERT(wqsrep->_operands.size() >= 2);
347 schuur         1.1  
348 venkat.puvvada 1.17                     WQLOperand lhs = wqsrep->_operands[j++];
349 schuur         1.1  
350 venkat.puvvada 1.17                     WQLOperand rhs = wqsrep->_operands[j++];
351 schuur         1.1  
352 venkat.puvvada 1.17                     terminal_heap.push(term_el_WQL(false, op, lhs, rhs));
353 schuur         1.1  
354 venkat.puvvada 1.17                     stack.push(CMPI_stack_el(terminal_heap.size()-1, true));
355 schuur         1.1  
356 venkat.puvvada 1.17                     break;
357                                     }
358 schuur         1.1  
359                                 case WQL_IS_TRUE:
360                                 case WQL_IS_NOT_FALSE:
361 venkat.puvvada 1.17                 {
362                                         PEGASUS_ASSERT(stack.size() >= 1);
363                                         break;
364                                     }
365 schuur         1.1  
366                                 case WQL_IS_NULL:
367 venkat.puvvada 1.17                 {
368                                         PEGASUS_ASSERT(wqsrep->_operands.size() >= 1);
369                                         WQLOperand op = wqsrep->_operands[j++];
370 schuur         1.1  
371 venkat.puvvada 1.17                     terminal_heap.push(term_el_WQL(false, WQL_EQ, op, dummy));
372 schuur         1.1  
373 venkat.puvvada 1.17                     stack.push(CMPI_stack_el(terminal_heap.size()-1, true));
374 schuur         1.1  
375 venkat.puvvada 1.17                     break;
376                                     }
377 schuur         1.1  
378                                 case WQL_IS_NOT_NULL:
379 venkat.puvvada 1.17                 {
380                                         PEGASUS_ASSERT(wqsrep->_operands.size() >= 1);
381                                         WQLOperand op = wqsrep->_operands[j++];
382 schuur         1.1  
383 venkat.puvvada 1.17                     terminal_heap.push(term_el_WQL(false, WQL_NE, op, dummy));
384 schuur         1.1  
385 venkat.puvvada 1.17                     stack.push(CMPI_stack_el(terminal_heap.size()-1, true));
386 schuur         1.1  
387 venkat.puvvada 1.17                     break;
388                                     }
389 schuur         1.1          }
390                         }
391                     
392                         PEGASUS_ASSERT(stack.size() == 1);
393 ms.aruran      1.18     PEG_METHOD_EXIT();
394 schuur         1.1  }
395                     
396                     void CMPI_Wql2Dnf::_pushNOTDown()
397                     {
398 ms.aruran      1.18     PEG_METHOD_ENTER(
399                             TRC_CMPIPROVIDERINTERFACE,
400                             "CMPI_Wql2Dnf::_pushNOTDown()");
401 venkat.puvvada 1.17     for( int i=eval_heap.size()-1; i >= 0; i-- )
402 schuur         1.1      {
403                             Boolean _found = false;
404                     
405                             // Order all operators, so that op1 > op2 for non-terminals
406                             // and terminals appear as second operand
407                     
408                             eval_heap[i].order();
409                     
410                             // First solve the unary NOT operator
411                     
412 venkat.puvvada 1.17         if( eval_heap[i].op == WQL_NOT ||
413                             eval_heap[i].op == WQL_IS_FALSE ||
414                             eval_heap[i].op == WQL_IS_NOT_TRUE )
415                             {
416 schuur         1.1              // This serves as the equivalent of an empty operator
417                                 eval_heap[i].op = WQL_IS_TRUE;
418                     
419                                 // Substitute this expression in all higher order eval statements
420                                 // so that this node becomes disconnected from the tree
421                     
422 venkat.puvvada 1.17             for( int j=eval_heap.size()-1; j > i;j-- )
423 schuur         1.1              {
424 venkat.puvvada 1.17                 // Test first operand
425                                     if( (!eval_heap[j].is_terminal1) && (eval_heap[j].opn1 == i) )
426                                     {
427                     
428                                         eval_heap[j].assign_unary_to_first(eval_heap[i]);
429                                     }
430                     
431                                     // Test second operand
432                                     if( (!eval_heap[j].is_terminal2) && (eval_heap[j].opn2 == i) )
433                                     {
434 schuur         1.1  
435 venkat.puvvada 1.17                     eval_heap[j].assign_unary_to_second(eval_heap[i]);
436                                     }
437 schuur         1.1              }
438                     
439                                 // Test: Double NOT created by moving down
440                     
441 venkat.puvvada 1.17             if( eval_heap[i].mark )
442                                 {
443                                     eval_heap[i].mark = false;
444                                 }
445 schuur         1.1              else
446 venkat.puvvada 1.17             {
447                                     _found = true;
448                                 }
449 schuur         1.1              // else indicate a pending NOT to be pushed down further
450                             }
451                     
452                             // Simple NOT created by moving down
453                     
454 venkat.puvvada 1.17         if( eval_heap[i].mark )
455 schuur         1.1          {
456                                 // Remove the mark, indicate a pending NOT to be pushed down
457                                 // further and switch operators (AND / OR)
458                     
459                                 eval_heap[i].mark=false;
460 venkat.puvvada 1.17             if( eval_heap[i].op == WQL_OR )
461                                 {
462                                     eval_heap[i].op = WQL_AND;
463                                 }
464                                 else
465                                 {
466                                     if( eval_heap[i].op == WQL_AND )
467                                     {
468                                         eval_heap[i].op = WQL_OR;
469                                     }
470                                 }
471 schuur         1.1  
472                                 // NOT operator is already ruled out
473                                 _found = true;
474                             }
475                     
476                             // Push a pending NOT further down
477 venkat.puvvada 1.17         if( _found )
478 schuur         1.1          {
479 venkat.puvvada 1.17             // First operand
480 schuur         1.1  
481 venkat.puvvada 1.17             int j = eval_heap[i].opn1;
482                                 if( eval_heap[i].is_terminal1 )
483                                 {
484                                     // Flip NOT mark
485                                     terminal_heap[j].negate();
486                                 }
487                                 else
488                                 {
489                                     eval_heap[j].mark = !(eval_heap[j].mark);
490                                 }
491                     
492                                 //Second operand (if it exists)
493                     
494                                 if( (j = eval_heap[i].opn2) >= 0 )
495                                 {
496                                     if( eval_heap[i].is_terminal2 )
497                                     {
498                                         // Flip NOT mark
499                                         terminal_heap[j].negate();
500                                     }
501                                     else
502 venkat.puvvada 1.17                 {
503                                         eval_heap[j].mark = !(eval_heap[j].mark);
504                                     }
505                                 }
506 schuur         1.1          }
507                         }
508 ms.aruran      1.18     PEG_METHOD_EXIT();
509 schuur         1.1  }
510                     
511                     void CMPI_Wql2Dnf::_factoring(void)
512                     {
513 ms.aruran      1.18     PEG_METHOD_ENTER(TRC_CMPIPROVIDERINTERFACE, "CMPI_Wql2Dnf::_factoring()");
514 schuur         1.1      int i = 0,n = eval_heap.size();
515                         //for (int i=eval_heap.size()-1; i >= 0; i--)
516 venkat.puvvada 1.17     while( i < n )
517 schuur         1.1      {
518                             int _found = 0;
519                             int index = 0;
520                     
521                             // look for expressions (A | B) & C  ---> A & C | A & B
522 venkat.puvvada 1.17         if( eval_heap[i].op == WQL_AND )
523 schuur         1.1          {
524 venkat.puvvada 1.17             if( !eval_heap[i].is_terminal1 )
525 schuur         1.1              {
526                                     index = eval_heap[i].opn1; // remember the index
527 venkat.puvvada 1.17                 if( eval_heap[index].op == WQL_OR )
528                                     {
529                                         _found = 1;
530                                     }
531 ks.madhusudan  1.20             }  
532                                 if( (_found == 0) && (!eval_heap[i].is_terminal2) )
533                                 {
534 venkat.puvvada 1.17                     index = eval_heap[i].opn2; // remember the index
535                                         if( eval_heap[index].op == WQL_OR )
536                                         {
537                                             _found = 2;
538                                         }
539 ks.madhusudan  1.20             }
540                     
541                                 if( _found != 0 )
542                                 {
543                                     //int u1,u1_t,u2,u2_t,u3,u3_t;
544                                     CMPI_stack_el s;
545                     
546                                     if( _found == 1 )
547                                     {
548                                         s = eval_heap[i].getSecond();
549 venkat.puvvada 1.17                 }
550 ks.madhusudan  1.20                 else
551 venkat.puvvada 1.17                 {
552 ks.madhusudan  1.20                     s = eval_heap[i].getFirst();
553                                     }
554 venkat.puvvada 1.17 
555 ks.madhusudan  1.20                 // insert two new expression before entry i
556                                     CMPI_eval_el evl;
557 venkat.puvvada 1.17 
558 ks.madhusudan  1.20                 evl = CMPI_eval_el(false, WQL_OR, i+1, false, i, false);
559                                     if( (Uint32 )i < eval_heap.size()-1 )
560                                     {
561 venkat.puvvada 1.17                     eval_heap.insert(i+1, evl);
562 ks.madhusudan  1.20                 }
563                                     else
564                                     {
565                                          eval_heap.append(evl);
566                                     }
567                                     eval_heap.insert(i+1, evl);
568 venkat.puvvada 1.17 
569 ks.madhusudan  1.20                 for( int j=eval_heap.size()-1; j > i + 2; j-- )
570                                     {
571                                         //eval_heap[j] = eval_heap[j-2];
572 venkat.puvvada 1.17 
573 ks.madhusudan  1.20                     // adjust pointers
574 venkat.puvvada 1.17 
575 ks.madhusudan  1.20                     if( (!eval_heap[j].is_terminal1)&&
576 venkat.puvvada 1.17                         (eval_heap[j].opn1 >= i) )
577 ks.madhusudan  1.20                     {
578                                             eval_heap[j].opn1 += 2;
579                                         }
580                                         if( (!eval_heap[j].is_terminal2)&&
581 venkat.puvvada 1.17                         (eval_heap[j].opn2 >= i) )
582 ks.madhusudan  1.20                     {
583                                             eval_heap[j].opn2 += 2;
584 venkat.puvvada 1.17                     }
585 ks.madhusudan  1.20                 }
586 venkat.puvvada 1.17 
587 ks.madhusudan  1.20                 n+=2; // increase size of array
588 venkat.puvvada 1.17 
589 ks.madhusudan  1.20                 // generate the new expressions : new OR expression
590 venkat.puvvada 1.17 
591 ks.madhusudan  1.20                 // first new AND expression
592                                     eval_heap[i+1].mark = false;
593                                     eval_heap[i+1].op = WQL_AND;
594                                     eval_heap[i+1].setFirst(s);
595                                     eval_heap[i+1].setSecond( eval_heap[index].getFirst());
596                                     eval_heap[i+1].order();
597                     
598                                     // second new AND expression
599                                     eval_heap[i].mark = false;
600                                     eval_heap[i].op = WQL_AND;
601                                     eval_heap[i].setFirst(s);
602                                     eval_heap[i].setSecond( eval_heap[index].getSecond());
603                                     eval_heap[i].order();
604                     
605                                     // mark the indexed expression as inactive
606                                     //eval_heap[index].op = WQL_IS_TRUE; possible disconnects
607                                     i--;
608                     
609                                 } /* endif _found > 0 */
610                     
611                             } /* endif found AND operator */
612 ks.madhusudan  1.20 
613                             i++; // increase pointer
614                         } // end of while loop
615                         
616 ms.aruran      1.18     PEG_METHOD_EXIT();
617 schuur         1.1  }
618 venkat.puvvada 1.17     void CMPI_Wql2Dnf::_gatherDisj(Array<CMPI_stack_el>& stk)
619                         {
620                             _gather(stk, CMPI_stack_el(0,true), true);
621                         }
622 schuur         1.1  
623 venkat.puvvada 1.17     void CMPI_Wql2Dnf::_gatherConj(
624                             Array<CMPI_stack_el>& stk,
625                             CMPI_stack_el sel)
626 schuur         1.1      {
627 venkat.puvvada 1.17         _gather(stk, sel, false);
628 schuur         1.1      }
629                     
630 venkat.puvvada 1.17     void CMPI_Wql2Dnf::_gather(
631                             Array<CMPI_stack_el>& stk,
632                             CMPI_stack_el sel,
633                             Boolean or_flag)
634 schuur         1.1      {
635 ms.aruran      1.18         PEG_METHOD_ENTER(TRC_CMPIPROVIDERINTERFACE, "CMPI_Wql2Dnf::_gather()");
636 venkat.puvvada 1.17         Uint32 i = 0;
637                     
638                             stk.clear();
639                             stk.reserveCapacity(16);
640 schuur         1.1  
641 venkat.puvvada 1.17         if( (i = eval_heap.size()) == 0 )
642                             {
643 ms.aruran      1.18             PEG_METHOD_EXIT();
644 venkat.puvvada 1.17             return;
645                             }
646 schuur         1.1  
647 venkat.puvvada 1.17         while( eval_heap[i-1].op == WQL_IS_TRUE )
648                             {
649                                 eval_heap.remove(i-1);
650                                 i--;
651                                 if( i == 0 )
652                                 {
653 ms.aruran      1.18                PEG_METHOD_EXIT();
654 venkat.puvvada 1.17                return;
655                                 }
656                             }
657                             //if (i == 0) return;
658 schuur         1.1  
659 venkat.puvvada 1.17         if( or_flag )
660                             {
661                                 stk.append(CMPI_stack_el(i-1,false));
662                             }
663 schuur         1.1          else
664                             {
665 venkat.puvvada 1.17             if( sel.is_terminal )
666                                 {
667 ms.aruran      1.18                 PEG_METHOD_EXIT();
668 venkat.puvvada 1.17                 return;
669                                 }
670                                 stk.append(sel);
671                             }
672                     
673                             i = 0;
674                     
675                             while( i<stk.size() )
676                             {
677                                 int k = stk[i].opn;
678                     
679                                 if( (k < 0) || (stk[i].is_terminal) )
680                                 {
681 schuur         1.3                  i++;
682 venkat.puvvada 1.17             }
683 schuur         1.1              else
684                                 {
685 venkat.puvvada 1.17                 if ( ((eval_heap[k].op != WQL_OR) && (or_flag)) ||
686                                          ((eval_heap[k].op != WQL_AND) && (!or_flag)) )
687                                     {
688                                         i++;
689                                     }
690                                     else
691                                     {
692                                         // replace the element with disjunction
693                                         stk[i] = eval_heap[k].getSecond();
694                                         stk.insert(i, eval_heap[k].getFirst());
695                                         if (or_flag)
696                                         {
697                                           eval_heap[k].op = WQL_IS_TRUE;
698                                         }
699                                     }
700 schuur         1.1              }
701                             }
702 ms.aruran      1.18         PEG_METHOD_EXIT();
703 schuur         1.1      }
704                     
705 venkat.puvvada 1.17 //=============================================================================
706 mike           1.16 //
707                     // class CMPI_stack_el
708                     //
709 venkat.puvvada 1.17 //=============================================================================
710 mike           1.16 
711 venkat.puvvada 1.17 //=============================================================================
712 mike           1.16 //
713                     // class CMPI_eval_el
714                     //
715 venkat.puvvada 1.17 //=============================================================================
716 mike           1.16 
717 venkat.puvvada 1.17     CMPI_stack_el CMPI_eval_el::getFirst()
718                         {
719                             return CMPI_stack_el(opn1, is_terminal1);
720                         }
721 mike           1.16 
722 venkat.puvvada 1.17     CMPI_stack_el CMPI_eval_el::getSecond()
723                         {
724                             return CMPI_stack_el(opn2, is_terminal2);
725                         }
726 mike           1.16 
727 venkat.puvvada 1.17     void CMPI_eval_el::setFirst(const CMPI_stack_el s)
728                         {
729                             opn1 = s.opn;
730                             is_terminal1 = s.is_terminal;
731                         }
732 mike           1.16 
733 venkat.puvvada 1.17     void CMPI_eval_el::setSecond(const CMPI_stack_el s)
734                         {
735                             opn2 = s.opn;
736                             is_terminal2 = s.is_terminal;
737                         }
738 mike           1.16 
739 venkat.puvvada 1.17     void CMPI_eval_el::assign_unary_to_first(const CMPI_eval_el & assignee)
740                         {
741                             opn1 = assignee.opn1;
742                             is_terminal1 = assignee.is_terminal1;
743                         }
744 mike           1.16 
745 venkat.puvvada 1.17     void CMPI_eval_el::assign_unary_to_second(const CMPI_eval_el & assignee)
746                         {
747                             opn2 = assignee.opn1;
748                             is_terminal2 = assignee.is_terminal1;
749                         }
750 mike           1.16 
751                     // Ordering operators, so that op1 > op2 for all non-terminals
752                     // and terminals appear in the second operand first
753                     void CMPI_eval_el::order(void)
754                     {
755 ms.aruran      1.18     PEG_METHOD_ENTER(TRC_CMPIPROVIDERINTERFACE, "CMPI_eval_el::order()");
756 mike           1.16     int k;
757 venkat.puvvada 1.17     if( (!is_terminal1) && (!is_terminal2) )
758 ks.madhusudan  1.20     {
759 venkat.puvvada 1.17         if( (k = opn2) > opn1 )
760 mike           1.16         {
761                                 opn2 = opn1;
762                                 opn1 =  k;
763                             }
764 ks.madhusudan  1.20     }
765                         else if ((is_terminal1) && (!is_terminal2))
766                         {
767                             if ((k = opn2) > opn1)
768 mike           1.16         {
769 ks.madhusudan  1.20             opn2 = opn1;
770                                 opn1 =  k;
771                                 is_terminal1 = false;
772                                 is_terminal2 = true;
773 mike           1.16         }
774 ks.madhusudan  1.20     }
775                            PEG_METHOD_EXIT();
776 mike           1.16 }
777                     
778 schuur         1.1  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2