Здравствуйте, 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
Кому нужно? Что нового это даст в рамках данной дискуссии?