示例#1
0
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;
}
示例#2
0
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;
}