Информация об изменениях

Сообщение Re[2]: [proof-of-concept] compile time query language от 11.07.2016 19:55

Изменено 11.07.2016 20:21 Evgeny.Panasyuk

Здравствуйте, VTT, Вы писали:

VTT>Как я понимаю, основной профит в автоматической генерации строчки SQL запроса?

VTT>Или в избавлении от
VTT>
VTT>

VTT>?

И в том, и в другом. То есть было:
auto handwritten()
{
    using namespace CTQL;

    struct Row
    {
        double value;
        int id;
        int number;
    } row;
    vector_noinline<Row> xs;
    
    dummy_db db;

    db.execute("SELECT foo.value, foo.id, foo.number FROM foo WHERE foo.id>42");

    auto count = db.read_count();
    xs.reserve(count);

    for(unsigned i=0; i!=count; ++i, db.move_to_next())
    {
        row.value = db.get<double>(0);
        row.id = db.get<int>(1);
        row.number = db.get<int>(2);

        xs.push_back(row);
    }
    
    return xs;
}

Стало:
from(foo).where(foo.id > 42_i).select(foo.value, foo.id, foo.number)


Плюс возможности по декомпозиции:
* итоговый запрос может собираться в разных частях программы
* повторяемые куски разных запросов могут быть вынесены и многократно переиспользованны.

Плюс оптимизация запросов (последний пример исходного сообщения). Плюс поддержка особенностей разных СУБД, и целевых оптимизаций под них.

Плюс, конечно же, типизация.
Re[2]: [proof-of-concept] compile time query language
Здравствуйте, VTT, Вы писали:

VTT>Как я понимаю, основной профит в автоматической генерации строчки SQL запроса?

VTT>Или в избавлении от
VTT>
VTT>

VTT>?

И в том, и в другом. То есть было:
auto handwritten()
{
    using namespace CTQL;

    struct Row
    {
        double value;
        int id;
        int number;
    } row;
    vector_noinline<Row> xs;
    
    dummy_db db;

    db.execute("SELECT foo.value, foo.id, foo.number FROM foo WHERE foo.id>42");

    auto count = db.read_count();
    xs.reserve(count);

    for(unsigned i=0; i!=count; ++i, db.move_to_next())
    {
        row.value = db.get<double>(0);
        row.id = db.get<int>(1);
        row.number = db.get<int>(2);

        xs.push_back(row);
    }
    
    return xs;
}
Стало:
to_vector( from(foo).where(foo.id > 42_i).select(foo.value, foo.id, foo.number) )
При этом ассемблерный код не изменился.

Плюс возможности по декомпозиции:
* итоговый запрос может собираться в разных частях программы
* повторяемые куски разных запросов могут быть вынесены и многократно переиспользованны.

Плюс оптимизация запросов (последний пример исходного сообщения). Плюс поддержка особенностей разных СУБД, и целевых оптимизаций под них.

Плюс, конечно же, типизация.