bool Transicion::cumpleCondiciones(std::map<std::string,std::string>*strings, std::map<std::string,std::string>*strings_contrario, std::map<std::string,int>*enteros, std::map<std::string,int>*enteros_contrario ) { for(int i=0;i<(int)condiciones.size();i++) { if(condiciones[i].tipo=="cadena") { if(!cumpleCondicion(condiciones[i],strings,strings_contrario)) return false; }else { if(!cumpleCondicion(condiciones[i],enteros,enteros_contrario)) return false; } } return true; }
int* FileManager :: where(Vector3d<const char*,const char*,const char*>* condiciones , VectorRelacional<const char*,int>*op_logic){ char* temp_register = (char*)calloc(1,*sizeOfRegister); //registro temporal para recorrer el archivo temp_register = (fileBuffer + (getPtrOfFirstRegister() - sizeOfHeader)) ;//obtener ultimo registro // areglo de enteros que contienen el numero de fila en caso de que cumpla condicion int* accepted_rows = new int[*numberOfRegisters]; //por cada registro //solo recorro (registros usados) veces for(int num_row = 0; num_row < (*numberOfRegisters-*numberOfFreeRegisters) ; num_row++){ //areglo de bools que contienen el resultado de cada condicion de izquierda a derecha bool* bools = new bool[condiciones->getLength()]; Nodo3d<const char*,const char*,const char*>* nodo_temp;//se crea un nodo temporal para recorrido nodo_temp = condiciones->get_primerNodo();//comenzando en el primer nodo de la lista de condiciones condiciones->get_ultimoNodo()->set_siguiente(NULL); //se evalúa cada condicion, se recorre lista de condiciones for(int r=0 ; r< condiciones->getLength() ; r++){ //nodo_temp->get_elemento1(), es la columna //nodo_temp->get_elemento2(), Es el operador "=" // nodo_temp->get_elemento3(), Es el campo bools[r] = cumpleCondicion(nodo_temp->get_elemento1(),nodo_temp->get_elemento2(), nodo_temp->get_elemento3(),temp_register); nodo_temp = nodo_temp->get_siguiente(); } bool final_bool; if(condiciones->getLength() > 1){ NodoRelacional<const char*,int>* _temp; _temp = op_logic->get_primerNodo(); op_logic->get_ultimoNodo()->set_siguiente(NULL); bool primera_vez=true; //ciclo para determinar si un registro cumple condiciones for(int f=0 ; f< op_logic->getLength() ; f++){ //_temp->get_elemento1() es el operador el nodo de recorrido temporal de la lista de operadores if(compare_strings(_temp->get_elemento1(),"AND") && primera_vez){//si es la primera vez final_bool = bools[f] && bools[f+1]; primera_vez=false; } //_temp->get_elemento1() es el operador el nodo de recorrido temporal de la lista de operadores if(compare_strings(_temp->get_elemento1(),"OR")&& primera_vez){//si es la primera vez final_bool = bools[f] || bools[f+1]; primera_vez=false; } //_temp->get_elemento1() es el operador el nodo de recorrido temporal de la lista de operadores if(compare_strings(_temp->get_elemento1(),"AND") && !primera_vez){ final_bool = final_bool && bools[f+1]; } //_temp->get_elemento1() es el operador el nodo de recorrido temporal de la lista de operadores if(compare_strings(_temp->get_elemento1(),"OR")&& !primera_vez){ final_bool = final_bool || bools[f+1]; } _temp = _temp->get_siguiente(); }//termna cilco de verificar cond*/ } else{ final_bool = bools[0]; } if(final_bool){//si cumple las condiciones que retorne el numero de fila accepted_rows[num_row] = num_row; } else{accepted_rows[num_row] =-1;} temp_register = (fileBuffer + (*(int*)(temp_register+OFFSET_PTRSIG) - sizeOfHeader)) ;//get siguiente registro } return accepted_rows; }