Re[146]: Тормознутость и кривость linq. Compile-time EDSL DB query proof-of-conc
От: Evgeny.Panasyuk Россия  
Дата: 06.07.16 11:47
Оценка:
Здравствуйте, gandjustas, Вы писали:

EP>>Здесь не имеет значения, я вообще не утверждал что это супер практично. Это пример в контексте утверждения о невозможности, впрочем твоё передёргивание вполне ожидаемо

G>Ты сделал то, что делает sqlpp.

1. Насколько я помню в sqlpp11 не zero overhead, где-то выше даже был тест показывающий пусть и незначительный но overhead по сравнению с ручным запросом. Я же показал нулевые накладные расходы по сравнению с ручной версией — от этого в дальнейшем и можно отталкиваться.
2. Я показал ровно то что ты просил

G>>>Фильтры и проекции, с джоинами потом разберемся


G>Теперь покажи то, что делает linq.


Ну конечно, начинается, как я и говорил

G>Для затравки:

G>
G>IQueryable<Foo> F(IQueryable<Foo> q, int? v) => v.HasValue ? q.Where(x => x.value == v) : q
G>


Пример чего? Полностью динамических запросов или комбинаторики? Полностью динамические запросы есть в примерах sqlpp11.
Пример на комбинаторику:
#include "ctql.hpp"

#include <iostream>

DEFINE_TABLE
(
    foo,
    (int, id)
    (int, code)
    (double, value)
    (int, number)
);

auto conditional = [](bool condition, auto true_case, auto false_case)
{
    return [=](auto f)
    {
        return condition ? true_case(f) : false_case(f);
    };
};

auto conditional_where = [](bool condition, auto part1, auto true_filter, auto false_filter)
{
    return conditional
    (
        condition,
        [=](auto f){ return part1([=](auto part){ return f(part.where(true_filter)); }); },
        [=](auto f){ return part1([=](auto part){ return f(part.where(false_filter)); }); }
    );
};

auto dynamic()
{
    volatile bool flag1 = false, flag2 = true, flag3 = false;
    
    auto part1 = [](auto f){ return f(from(foo)); };

    auto part2 = conditional_where(flag1, part1, foo.number > 11_i, foo.number > 12_i);
    auto part3 = conditional_where(flag2, part2, foo.value > 21_i, foo.value > 22_i);
    auto part4 = conditional_where(flag3, part3, foo.id > 31_i, foo.id > 32_i);

    return part4;
}

int main()
{
    auto final = dynamic()([](auto part)
    {
        return part.select(foo.value, foo.id, foo.number).to_vector();
    });

    for(auto &&x : final)
    {
        using namespace std;
        cout << x.id << " " << x.value << " " << x.number << endl;
        // cout << x.code; // - compile error, because .code is not in projection
    }
}

LIVE DEMO
Во время компиляции генерируются восемь разных запросов, о чём я тебе и говорил более года назад
Автор: Evgeny.Panasyuk
Дата: 14.04.15
:
  Скрытый текст
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc49ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc49ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc49EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc50ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc49ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc49EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc49ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc50ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc49EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc50ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc50ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc49EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc49ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc49ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc50EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc50ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc49ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc50EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc49ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc50ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc50EEE5valueE
    mov    esi, OFFSET FLAT:_ZN12string_valueIJLc115ELc101ELc108ELc101ELc99ELc116ELc32ELc102ELc111ELc111ELc46ELc118ELc97ELc108ELc117ELc101ELc44ELc32ELc102ELc111ELc111ELc46ELc105ELc100ELc44ELc32ELc102ELc111ELc111ELc46ELc110ELc117ELc109ELc98ELc101ELc114ELc32ELc102ELc114ELc111ELc109ELc32ELc102ELc111ELc111ELc32ELc119ELc104ELc101ELc114ELc101ELc32ELc110ELc117ELc109ELc98ELc101ELc114ELc62ELc50ELc32ELc97ELc110ELc100ELc32ELc118ELc97ELc108ELc117ELc101ELc62ELc50ELc50ELc32ELc97ELc110ELc100ELc32ELc105ELc100ELc62ELc51ELc50EEE5valueE


G>1) Три разных типа для select, where и from не подойдут, не будет никакой композиции


Декомпозиция/композиция при конкретных типах есть.
Если ты чего-то не понимаешь, то не надо додумывать что тебе хочется и утверждать это как факт — лучше спроси про непонятные места

G>2) Запрос должен быть с параметрами


И что от этого принципиально поменяется? Ну добавиться в запрос закорючка, а в db новый аргумент

G>3) Нужно поддерживать nullable


Кому нужно? Что нового это даст в рамках данной дискуссии?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.