Exemple #1
0
static void processFlush(Flush_t *fl, Lista<VQueries> *v_array, Journal **j_array, Hashtable **h_array, ofstream *results, ofstream* debug){
	//cout << "Flush " << fl->validationId << endl;
	
	uint32_t i=0, j=0;

	VQueries* v;

	v = v_array->preview();
	if (v==NULL) return;
	
	while(v->getVid() <= fl->validationId){				//gia validations
		
		v = v_array->pop();
/*
		if(v->getVid()==19631){
			j_array[27]->printJournal();
			cout << endl<<endl << "-------------------------------------------"<<endl<<endl;
			j_array[26]->printJournal();

		}
*/

		bool answer = 0;

		Lista<JournalRecord> * lista = NULL;

		for (i=0; i< v->getQueryCount(); i++){					//gia queries

			Query * q = v->getQuery(i);
			Column * c;

			///////////////////////////// 
			///*
			for (j=0; j< q->getColCount(); j++){
				c =  q->getColumn(j);
				if((c->getCol() == 0)&&(c->getOp() == Equal)){
					lista = h_array[q->getRelId()]->getHashJR(j_array[q->getRelId()], v->getFrom(), v->getTo(), c->getVal());
					break;
				}
			}
			//*/
			/////////////////////////////////
			
			if(lista == NULL){
				lista = j_array[q->getRelId()]->getJournalJR(v->getFrom(), v->getTo());	
			}
			else if(lista->getCounter()==0){
				delete lista;
				lista = j_array[q->getRelId()]->getJournalJR(v->getFrom(), v->getTo());	
			}

			answer = 1; //OR MAYBE answer = 1|1 of course;

			for (j=0; j< q->getColCount(); j++){

				c = q->getColumn(j);

				uint64_t elemcount = lista->getCounter();
				uint64_t elemptr;

				uint32_t c1 = c->getCol();
				uint64_t value = c->getVal();
				Op_t op = c->getOp();

				JournalRecord * rec;

				for(elemptr=0; elemptr<elemcount; elemptr++){
					rec = lista->pop();
					if (rec==NULL) break;
					switch(op){
						case Equal:	
							if(rec->getSpecCol(c1+1)==value){
								lista->push(rec);
							}
							break;
						case NotEqual:
							if(rec->getSpecCol(c1+1)!=value){
								lista->push(rec);
							}
							break;
						case Less:
							if(rec->getSpecCol(c1+1)<value){
								lista->push(rec);
							}
							break;
						case LessOrEqual:
							if(rec->getSpecCol(c1+1)<=value){
								lista->push(rec);
							}
							break;
						case Greater:
							if(rec->getSpecCol(c1+1)>value){
								lista->push(rec);
							}
							break;
						case GreaterOrEqual:
							if(rec->getSpecCol(c1+1)>=value){
								lista->push(rec);
							}
							break;
						default: return;
					}
				}
				if(lista->getCounter() == 0){
					answer = 0; //OR MAYBE answer = 0|0  :P ;
					break;
				}

			}
			
			if (v->getQueryCount()>1){
				if(q->getColCount()==0)
					answer = 0;
			}

			if (answer == 1)
				break;
		}

		if (v->getQueryCount()==0)
			answer = 1;

		lista->popall();
		delete lista;

		*results << answer;

		delete v;
		v = v_array->preview();
		if (v==NULL) return;
		
	}
}