2015-09-27 5 views
0

Я строю реляционный язык/библиотеку, которая похожа на j/kdb +/tutorialD в духе.Как реализовать реляционный JOIN в чистом F #?

Идея заключается в том, что конечный пользователь будет: загружать данные (в памяти, из любого места), выполнять запросы, делать соединения, агрегировать и т. Д. Таким образом, похоже, что LINQ везде, as a first-class citizen языка ,

Отношение состоит из:

1- заголовок со списком пары имя * типа 2- Тело со списком строк, где каждая строка должна соответствовать с заголовком

Итак, как таблица.

Что-то вроде этого:

type ExprC = 
    | BoolC of bool 
    | DecC of decimal 
    | Str16C of string #And others! 
and 
    ColumnC = {name:string; colType:ExprC} 
and 
    HeaderC = ColumnC array 
and 
    RelC = {header:array<string>; data:array<array<ExprC>>} 

Итак, мне нужно реализовать в полной мере реляционные операторы. ПРОЕКЦИЯ (выберите) & ОГРАНИЧЕНИЕ (где) легко, но JOIN выглядит сложным. Это потому, что мне нужно пройти оба столбца (и упорядочить их?), Чтобы вычислить соединение, а затем удалить дубликат столбца, который используется для соединения, а затем дать результат.

Делайте каждую вещь отдельно, это легко, но я думаю, что много отходов. Я обнаружил, что заявлено, что merge-sort-join - это путь, но не знаю, как применить к этой ситуации, когда я интерпретирую.

Я могу что-то изменить в настоящее время .. Мое единственное требование заключается в том, что решение не мешает плохому исполнению полной реляционной модели, а производительность - «хорошо».

ответ

0

Jon Skeet переопределил LINQ в объекты, используя C#, это может вас вдохновить. Ниже приведено подробное описание реализации JOIN (внутреннего соединения) для двух последовательностей: Reimplementing LINQ to Objects: Part 19 – Join.

+0

Wow ... Wonderfull ресурс. Это займет много времени, чтобы переварить, но, человек, все есть! – mamcx

+0

Желаю удачи в вашей библиотеке. Если вы сделаете это с открытым исходным кодом, дайте мне знать. –