DiegoEmilio01 / IIC3413

Repositorio del curso Implementación de Sistemas de Bases de Datos
16 stars 1 forks source link

Duda respecto al input de IsamNonClusteredIter en IsamNonClustered #23

Open anamarn opened 5 months ago

anamarn commented 5 months ago

Hola!

Asi se presenta el codigo de IsamNonClustered::get_iter y la funccion serializa_string_key:

int64_t serialize_string_key(const char* str) {
    uint64_t res = 0;

    int shift_size = 8*7;
    for (int i = 0; i < 8 && *str != '\0'; i++, str++, shift_size -= 8) {
        uint64_t byte64 = static_cast<uint64_t>(*str);
        res |= byte64 << shift_size;
    }

    return res;
}
std::unique_ptr<RelationIter> IsamNonClustered::get_iter(const Value& min, const Value& max) {
    int64_t encoded_min;
    int64_t encoded_max;

    auto key_datatype = heap_file.schema.datatypes[key_column_idx];
    switch (key_datatype) {
    case DataType::STR: {
        encoded_min = serialize_string_key(min.value.as_str);
        encoded_max = serialize_string_key(max.value.as_str);
        break;
    }

    case DataType::INT: {
        encoded_min = min.value.as_int;
        encoded_max = max.value.as_int;
        break;
    }
    }
    auto start_page_num = root->search_leaf(encoded_min);
    auto end_page_num = root->search_leaf(encoded_max);

    return std::make_unique<IsamNonClusteredIter>(
        *this, min, max, key_column_idx, start_page_num, end_page_num //porque min y max y no encoded???
    );
}

Como se puede observar el IsamNonClusteredIter recibe min y max, no obstante estos valores pueden ser un string o un entero, por lo tanto no siempre se pueden comparar, luego: No seria mejor pasar los valores encoded para asi hacer una comparacion directa dentro del metodo? O este es el comportamiento esperado ? Cual seria la logica de diseno en este caso?

cirojas commented 5 months ago

La razón es que serialize_string_key pierde información si el string tiene más de 8 bytes, y la idea es que el iterador maneje bien los bordes aunque existan strings con más de 8 bytes.

En el issue #17 hay una conversación de este tema.