metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-27 08:32 am
Entry tags:

F#, Reflector, Firebird и кодогенерация (ака вуду^4)

Смотрю .NET Reflector на внутренности программы на F# и всячески торчу.
50 строк на F# разворачивается в четыре автосгенеренных класса-замыкания, автоматически управляющих десятком объектов для доступа к базе данных и все это в итоге представляет собой функцию "коннект к Firebird -> хитрозаколдованная структура с данными".

А я еще собираюсь и сам код на F# сгенерить из результатов парсинга запросов в БД, чтобы вообще руками ничего не писать, кроме SQL запросов. Т.е. "чтобы было все и мне за это ничего не было".

Т.е. идея примерно такая:
1)есть структура реляционной БД - мне в ее категориях проще проектировать и думать.
2)есть запросы к ней и связи между ними - которые мне тоже проще придумать, чем делать маппинги в ORM или писать запросы на LINQToSQL, который вообще не факт что поддерживается для Firebird.

Я описываю запросы на SQL, кодогенератором автоматически конвертирую их в функции F# вида ("коннект к БД" -> "параметр запроса 1" -> "параметр запроса 2" -> ... -> "ленивая последовательность записей с результатами").
Затем полученные функции я собираю в законченную структуру, описывая связи между ними уже на F# и получаю на выходе что-то вроде "Запись, поля которой представляют собой ленивые последовательности с результами запросов, причем внутри эти результатов могут быть такие же поля - ленивые последовательности с результатами вложенных запросов".

Не совсем понятно, почему бы это все не сделать на обычном NHibernate, но тут ключевой аспект - что работа не сущностями и маппингами их на базу, а с результатами произвольных SQL-запросов, что мне гораздо более важно.

[identity profile] kong-en-ge.livejournal.com 2010-03-27 09:08 am (UTC)(link)
Все, ребе, ремиссия закончилась? :)

[identity profile] metaclass.livejournal.com 2010-03-27 09:14 am (UTC)(link)
Да, деньги не платят, так хоть поработаю.

[identity profile] aamonster.livejournal.com 2010-03-27 09:32 am (UTC)(link)
«Впервые понятие комбинатора и основанная на нём теория были сформалированны М.И.Шейнфинкелем в работе Schonfinkel (1924) ещё до появления лямбда-исчисления. Вскоре после этого аналогичные результаты были получены Карри, независимо от Шейнфинкеля и Чёрча. Когда Карри ознакомился с работами Шейнфинкеля, он предпринял попытку с ним связаться, но к этому времени Шейнфинкель оказался в психиатрической лечебнице.»

© Введение в функциональное программирование.

[identity profile] nivanych.livejournal.com 2010-03-27 09:54 am (UTC)(link)
> к этому времени Шейнфинкель
> оказался в психиатрической лечебнице.

А вот этой детали я не знал ;-)

[identity profile] nivanych.livejournal.com 2010-03-27 09:52 am (UTC)(link)
> вуду^4

До 4^вуду, видимо, ещё не дошло.

[identity profile] madeveloper.livejournal.com 2010-03-27 11:51 am (UTC)(link)
Ну HQL достаточно произвольные запросы позволяет. Единственное на чем обломился - это ранковые оконные функции и иерархические запросы. Для них пришлось писать надстройку через нативный SQL но с построителем использующим метаданные маппингов.

[identity profile] norian.livejournal.com 2010-03-27 06:36 pm (UTC)(link)
как-то написал такую хрень на дельфях для дельфей и оракла

поля таблицы (текст) -> вид -> запросы на выборку, просмотр (2), вставку, удаление, редактирование -> табличная форма + форма редактирования записи

имхо лучший из вариант разработки интерфейса к не очень привиредливой базе :о))

[identity profile] metaclass.livejournal.com 2010-03-27 07:33 pm (UTC)(link)
Ага, у меня то же самое для дельфей и Firebird.

[identity profile] b-al-u.livejournal.com 2010-03-29 08:07 am (UTC)(link)
У меня тоже на питоне