Trie Implementation
[csql.git] / src / storage / Expression.cxx
bloba9a669a4ecff7e096e676f0104ea70052ece082a
1 /***************************************************************************
2 * Copyright (C) 2007 by www.databasecache.com *
3 * Contact: praba_tuty@databasecache.com *
4 * *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * ***************************************************************************/
17 #include<Expression.h>
18 #include<Table.h>
19 #include<TableImpl.h>
21 void Expression::setTable(Table *tbl )
23 if(NULL!=lhs)
24 lhs->setTable(tbl);
25 if(NULL!=rhs)
26 rhs->setTable(tbl);
28 table=(TableImpl*) tbl;
31 void Expression::setTuple(void *tpl)
33 if(NULL!=lhs)
34 lhs->setTuple(tpl);
35 if(NULL!=rhs)
36 rhs->setTuple(tpl);
38 tuple = tpl;
40 void Expression::setFunctionType(FunctionType type)
42 if(NULL!=lhs)
43 lhs->setFunctionType(type);
44 if(NULL!=rhs)
45 rhs->setFunctionType(type);
46 fType = type;
48 void Expression::setExpr(Expression* exp1, FunctionType type,Expression* exp2)
50 lhs = exp1;
51 rhs = exp2;
52 setFunctionType(type);
53 arOp=unKnownOperator;
55 void Expression::setExpr(void *cVal,bool flag)
57 arOp=unKnownOperator;
58 constVal=cVal;
59 lhs = rhs = NULL;
62 void Expression::setExpr(char const *name,ArithOperator op,void *cVal)
64 strcpy(fldName, name);
65 arOp = op;
66 constVal = cVal;
67 lhs = rhs = NULL;
70 void Expression::setExpr(char const *name)
72 strcpy(fldName, name);
73 arOp=unKnownOperator;
74 constVal=NULL;
75 lhs = rhs = NULL;
78 void Expression::setExpr(Expression *exp1, ArithOperator op, Expression *exp2)
80 lhs = exp1;
81 rhs = exp2;
82 arOp = op;
85 void *Expression::evaluate(DataType type,bool &result)
87 calVal=AllDataType::alloc(type,IDENTIFIER_LENGTH);
88 AllDataType::memoryset(calVal,type);
89 char *rhsResult = NULL , *lhsResult = NULL;
90 if (NULL != lhs)
92 lhsResult =(char *) lhs->evaluate(type,result);
93 if (NULL == lhsResult) return lhsResult;
95 if (NULL != rhs)
97 rhsResult = (char *)rhs->evaluate(type,result);
98 if (NULL == rhsResult) return rhsResult;
100 if(result){return tuple;}
101 if (0==strcmp(fldName,"NULL")){
102 result=true;return tuple;
104 int offset;
105 char *val=NULL;
106 if(NULL==lhs && NULL == rhs)
108 if(strcmp(fldName,"\0")!=0)
110 DataType srcType = table->getFieldType(fldName);
111 if(srcType > 12) return NULL;
112 else
114 offset=table->getFieldOffset(fldName);
115 val= ((char*) tuple) + offset;
116 if(table->isFldNull(fldName))
118 result=true;
119 return tuple;
124 if(constVal!= NULL && strcmp(fldName,"\0")!=0)
126 os::memcpy(calVal,val,table->getFieldLength(fldName));
127 solve(calVal, constVal, type, arOp);
129 else if(constVal!= NULL && 0==strcmp(fldName,"\0"))
131 AllDataType::copyVal(calVal, constVal, type, IDENTIFIER_LENGTH);
133 else if( NULL==constVal && strcmp(fldName,"\0")!=0)
135 os::memcpy(calVal,val,table->getFieldLength(fldName));
137 return calVal;
139 if(NULL!=lhsResult && NULL!=rhsResult)
141 solve(lhsResult, rhsResult, type, arOp);
142 return lhsResult;
147 void *Expression::evaluateForFunction(DataType type)
149 void *rhsResult = NULL , *lhsResult = NULL;
150 if (NULL != lhs)
152 lhsResult =(char *) lhs->evaluateForFunction(type);
153 if (NULL == lhsResult) return lhsResult;
155 if (NULL != rhs)
157 rhsResult = (char *)rhs->evaluateForFunction(type);
158 if (NULL == rhsResult) return rhsResult;
160 int offset;
161 char *val=NULL;
162 if(NULL==lhs && NULL == rhs)
164 if(strcmp(fldName,"\0")!=0)
166 DataType srcType = table->getFieldType(fldName);
167 offset=table->getFieldOffset(fldName);
168 setDataType(srcType);
169 val= ((char*) tuple) + offset;
170 if(table->isFldNull(fldName))
172 return NULL;
173 }else {
174 calVal=AllDataType::alloc(srcType,IDENTIFIER_LENGTH);
175 AllDataType::copyVal(calVal,val, srcType,IDENTIFIER_LENGTH);
176 return calVal;
180 calVal=AllDataType::alloc(type,IDENTIFIER_LENGTH);
181 AllDataType::memoryset(calVal,type);
182 if(constVal!= NULL && strcmp(fldName,"\0")==0)
184 copyFunctionVal(calVal, constVal, fType, IDENTIFIER_LENGTH);
185 return calVal;
188 if(NULL!=lhsResult && NULL!=rhsResult)
190 if(calVal==NULL){
191 calVal=AllDataType::alloc(type,IDENTIFIER_LENGTH);
192 AllDataType::memoryset(calVal,type);
194 return evaluateAndGetValPtr(lhsResult,rhsResult);
196 if(NULL!=lhsResult && NULL==rhsResult)
198 if(calVal==NULL){
199 calVal=AllDataType::alloc(type,IDENTIFIER_LENGTH);
200 AllDataType::memoryset(calVal,type);
202 dType = lhs->getDataType();
203 if(dType == typeTimeStamp)
205 if(fType == EXTRACTYEARFROMDAY || fType == EXTRACTHOURFROMTIME
206 || fType == EXTRACTMINFROMTIME || fType ==EXTRACTSECFROMTIME
207 || fType == EXTRACTMONFROMDAY || fType ==EXTRACTDAYFROMDAY)
209 fType = (FunctionType)((int)(fType)+3);
212 return evaluateAndGetValPtr(lhsResult,rhsResult);
214 return NULL;
217 void *Expression::evaluateAndGetValPtr( void *lhsResult, void *rhsResult)
219 switch(fType)
221 case DATEDIFF:
223 *(int *)calVal = (*(Date*)lhsResult - *(Date*)rhsResult);
224 return calVal;
226 case DATEADDWITHYEAR:
228 ((Date*)lhsResult)->addYear(*(int*)rhsResult);
229 return lhsResult;
231 case DATEADDWITHMON:
233 ((Date*)lhsResult)->addMonth(*(int*)rhsResult);
234 return lhsResult;
236 case DATEADDWITHDAY:
238 ((Date*)lhsResult)->addDay(*(int*)rhsResult);
239 return lhsResult;
241 case DATESUBWITHYEAR:
243 ((Date*)lhsResult)->subYear(*(int*)rhsResult);
244 return lhsResult;
246 case DATESUBWITHMON:
248 ((Date*)lhsResult)->subMonth(*(int*)rhsResult);
249 return lhsResult;
251 case DATESUBWITHDAY:
253 ((Date*)lhsResult)->subDay(*(int*)rhsResult);
254 return lhsResult;
256 case TIMEDIFF:
258 *(int *)calVal = (*(Time*)lhsResult - *(Time*)rhsResult);
259 return calVal;
261 case TIMEADDWITHHOUR:
263 ((Time*)lhsResult)->addHour(*(int*)rhsResult);
264 return lhsResult;
266 case TIMEADDWITHMIN:
268 ((Time*)lhsResult)->addMin(*(int*)rhsResult);
269 return lhsResult;
271 case TIMEADDWITHSEC:
273 ((Time*)lhsResult)->addSec(*(int*)rhsResult);
274 return lhsResult;
276 case TIMESUBWITHHOUR:
278 ((Time*)lhsResult)->subHour(*(int*)rhsResult);
279 return lhsResult;
281 case TIMESUBWITHMIN:
283 ((Time*)lhsResult)->subMin(*(int*)rhsResult);
284 return lhsResult;
286 case TIMESUBWITHSEC:
288 ((Time*)lhsResult)->subSec(*(int*)rhsResult);
289 return lhsResult;
291 case TIMESTAMPADDWITHYEAR:
293 ((TimeStamp*)lhsResult)->addYear(*(int*)rhsResult);
294 return lhsResult;
296 case TIMESTAMPADDWITHMON:
298 ((TimeStamp*)lhsResult)->addMonth(*(int*)rhsResult);
299 return lhsResult;
301 case TIMESTAMPADDWITHDAY:
303 ((TimeStamp*)lhsResult)->addDay(*(int*)rhsResult);
304 return lhsResult;
306 case TIMESTAMPSUBWITHYEAR:
308 ((TimeStamp*)lhsResult)->subYear(*(int*)rhsResult);
309 return lhsResult;
311 case TIMESTAMPSUBWITHMON:
313 ((TimeStamp*)lhsResult)->subMonth(*(int*)rhsResult);
314 return lhsResult;
316 case TIMESTAMPSUBWITHDAY:
318 ((TimeStamp*)lhsResult)->subDay(*(int*)rhsResult);
319 return lhsResult;
321 case TIMESTAMPADDWITHHOUR:
323 ((TimeStamp*)lhsResult)->addHour(*(int*)rhsResult);
324 return lhsResult;
326 case TIMESTAMPADDWITHMIN:
328 ((TimeStamp*)lhsResult)->addMin(*(int*)rhsResult);
329 return lhsResult;
331 case TIMESTAMPADDWITHSEC:
333 ((TimeStamp*)lhsResult)->addSec(*(int*)rhsResult);
334 return lhsResult;
336 case TIMESTAMPSUBWITHHOUR:
338 ((TimeStamp*)lhsResult)->subHour(*(int*)rhsResult);
339 return lhsResult;
341 case TIMESTAMPSUBWITHMIN:
343 ((TimeStamp*)lhsResult)->subMin(*(int*)rhsResult);
344 return lhsResult;
346 case TIMESTAMPSUBWITHSEC:
348 ((TimeStamp*)lhsResult)->subSec(*(int*)rhsResult);
349 return lhsResult;
351 case TIMESTAMPDIFFYEAR:
353 *(int *)calVal = ((TimeStamp*)lhsResult)->yearDiff((*(TimeStamp*)rhsResult));
354 return calVal;
356 case TIMESTAMPDIFFMON:
358 *(int *)calVal = ((TimeStamp*)lhsResult)->monthDiff((*(TimeStamp*)rhsResult));
359 return calVal;
361 case TIMESTAMPDIFFDAY:
363 *(int *)calVal = ((TimeStamp*)lhsResult)->dayDiff((*(TimeStamp*)rhsResult));
364 return calVal;
366 case TIMESTAMPDIFFHOUR:
368 *(int *)calVal = ((TimeStamp*)lhsResult)->hourDiff((*(TimeStamp*)rhsResult));
369 return calVal;
371 case TIMESTAMPDIFFMIN:
373 *(int *)calVal = ((TimeStamp*)lhsResult)->minDiff((*(TimeStamp*)rhsResult));
374 return calVal;
376 case TIMESTAMPDIFFSEC:
378 *(int *)calVal = ((TimeStamp*)lhsResult)->secDiff((*(TimeStamp*)rhsResult));
379 return calVal;
381 case EXTRACTYEARFROMDAY:
383 *(int *)calVal = ((Date*)lhsResult)->year();
384 return calVal;
386 case EXTRACTMONFROMDAY:
388 *(int *)calVal = ((Date*)lhsResult)->month();
389 return calVal;
391 case EXTRACTDAYFROMDAY:
393 *(int *)calVal = ((Date*)lhsResult)->dayOfMonth();
394 return calVal;
396 case EXTRACTHOURFROMTIME:
398 *(int *)calVal = ((Time*)lhsResult)->hours();
399 return calVal;
401 case EXTRACTMINFROMTIME:
403 *(int *)calVal = ((Time*)lhsResult)->minutes();
404 return calVal;
406 case EXTRACTSECFROMTIME:
408 *(int *)calVal = ((Time*)lhsResult)->seconds();
409 return calVal;
411 case EXTRACTYEARFROMTIMESTAMP:
413 *(int *)calVal = ((TimeStamp*)lhsResult)->year();
414 return calVal;
416 case EXTRACTMONFROMTIMESTAMP:
418 *(int *)calVal = ((TimeStamp*)lhsResult)->month();
419 return calVal;
421 case EXTRACTDAYFROMTIMESTAMP:
423 *(int *)calVal = ((TimeStamp*)lhsResult)->dayOfMonth();
424 return calVal;
426 case EXTRACTHOURFROMTIMESTAMP:
428 *(int *)calVal = ((TimeStamp*)lhsResult)->hours();
429 return calVal;
431 case EXTRACTMINFROMTIMESTAMP:
433 *(int *)calVal = ((TimeStamp*)lhsResult)->minutes();
434 return calVal;
436 case EXTRACTSECFROMTIMESTAMP:
438 *(int *)calVal = ((TimeStamp*)lhsResult)->seconds();
439 return calVal;
441 case DATEFROMTIMESTAMP:
443 ((TimeStamp*)lhsResult)->getDate(*(Date *)calVal);
444 return calVal;
446 case TIMEFROMTIMESTAMP:
448 ((TimeStamp*)lhsResult)->getTime(*(Time *)calVal);
449 return calVal;
451 default: return NULL;
456 void Expression::copyFunctionVal(void *dest,void *src, FunctionType type, int length)
458 switch(type)
460 case DATEDIFF:
462 //Date date;
463 //date.parseFrom((char*)src);
464 AllDataType::copyVal(dest, src, typeDate,length);
465 return;
467 case DATEADDWITHYEAR:
469 AllDataType::copyVal(dest, src,typeInt,length);
470 return;
472 case DATEADDWITHMON:
474 AllDataType::copyVal(dest, src,typeInt,length);
475 return;
477 case DATEADDWITHDAY:
479 AllDataType::copyVal(dest, src,typeInt,length);
480 return;
482 case DATESUBWITHYEAR:
484 AllDataType::copyVal(dest, src,typeInt,length);
485 return;
487 case DATESUBWITHMON:
489 AllDataType::copyVal(dest, src,typeInt,length);
490 return;
492 case DATESUBWITHDAY:
494 AllDataType::copyVal(dest, src,typeInt,length);
495 return;
497 case TIMEDIFF:
499 AllDataType::copyVal(dest, src, typeTime,length);
500 return;
502 case TIMEADDWITHHOUR:
503 case TIMEADDWITHMIN:
504 case TIMEADDWITHSEC:
505 case TIMESUBWITHHOUR:
506 case TIMESUBWITHMIN:
507 case TIMESUBWITHSEC:
509 AllDataType::copyVal(dest, src,typeInt,length);
510 return;
512 case TIMESTAMPADDWITHYEAR:
513 case TIMESTAMPADDWITHMON:
514 case TIMESTAMPADDWITHDAY:
515 case TIMESTAMPSUBWITHYEAR:
516 case TIMESTAMPSUBWITHMON:
517 case TIMESTAMPSUBWITHDAY:
518 case TIMESTAMPADDWITHHOUR:
519 case TIMESTAMPADDWITHMIN:
520 case TIMESTAMPADDWITHSEC:
521 case TIMESTAMPSUBWITHHOUR:
522 case TIMESTAMPSUBWITHMIN:
523 case TIMESTAMPSUBWITHSEC:
525 AllDataType::copyVal(dest, src,typeInt,length);
526 return;
528 case TIMESTAMPDIFFYEAR:
529 case TIMESTAMPDIFFMON:
530 case TIMESTAMPDIFFDAY:
531 case TIMESTAMPDIFFHOUR:
532 case TIMESTAMPDIFFMIN:
533 case TIMESTAMPDIFFSEC:
535 AllDataType::copyVal(dest, src,typeTimeStamp,length);
536 return;
538 case EXTRACTYEARFROMDAY:
539 case EXTRACTMONFROMDAY:
540 case EXTRACTDAYFROMDAY:
542 AllDataType::copyVal(dest, src,typeDate,length);
543 return;
545 case EXTRACTHOURFROMTIME:
546 case EXTRACTMINFROMTIME:
547 case EXTRACTSECFROMTIME:
549 AllDataType::copyVal(dest, src,typeTime,length);
550 return;
552 case EXTRACTYEARFROMTIMESTAMP:
553 case EXTRACTMONFROMTIMESTAMP:
554 case EXTRACTDAYFROMTIMESTAMP:
555 case EXTRACTHOURFROMTIMESTAMP:
556 case EXTRACTMINFROMTIMESTAMP:
557 case EXTRACTSECFROMTIMESTAMP:
559 AllDataType::copyVal(dest, src,typeTimeStamp,length);
560 return;
563 case DATEFROMTIMESTAMP:
564 case TIMEFROMTIMESTAMP:
566 AllDataType::copyVal(dest, src,typeTimeStamp,length);
567 return;
570 default: return;
575 void Expression::solve(void *opand1, void *opand2, DataType type, ArithOperator arOp)
577 switch(arOp)
579 case addition:
580 AllDataType::addVal(opand1, opand2, type );
581 break;
582 case subtraction:
583 AllDataType::subVal(opand1, opand2, type);
584 break;
585 case multiplication:
586 AllDataType::mulVal(opand1, opand2, type);
587 break;
588 case division:
589 AllDataType::divVal(opand1, opand2, type);
590 break;
591 case modulus:
592 AllDataType::mudVal(opand1, opand2, type);
593 break;
594 default:
595 break;
597 return;
600 bool Expression::isSingleTerm()
602 if (NULL==lhs && NULL==rhs ) return true;
603 else false;
605 void Expression::memFree()
607 if(lhs!=NULL)
608 lhs->memFree();
609 if(rhs!=NULL)
610 rhs->memFree();
611 free(calVal);
614 void Expression::convertStrToVal(DataType type)
616 if(lhs!=NULL)
617 lhs->convertStrToVal(type);
618 if(rhs!=NULL)
619 rhs->convertStrToVal(type);
620 if(constVal !=NULL)
622 void *parseString=constVal;
623 constVal=AllDataType::alloc(type);
624 AllDataType::strToValue(constVal,(char*)parseString, type);
625 free(parseString);
629 void Expression::freeVal()
631 if(lhs!=NULL)
632 lhs->freeVal();
633 if(rhs!=NULL)
634 rhs->freeVal();
635 if(constVal !=NULL)
636 free(constVal);