Hello,

I would like to announce that I have ported the Calcite CSV example (scannable table only) from Java to Clojure.

I did it mainly as an exercise: to learn how Calicte works and how it would look with Clojure.

I learn a lot in the process and also discovered a Calcite bug https://issues.apache.org/jira/browse/CALCITE-4966 .

If anyone is interested, my code is available here: https://github.com/ieugen/clojure-training/tree/main/csv-clojure .

Id does need a version of Calcite with the fix for https://issues.apache.org/jira/browse/CALCITE-4966 (I built and deployed a local version).

It also needs a small 1 class library used as a bridge (build and install locally): https://github.com/ieugen/clojure-training/blob/main/csv-clojure/calcite-clj/src/main/java/ro.ieugen.calcite.clj/SchemaFactory.java .

With the above code I was able to call code like this:
(let [db {:jdbcUrl "jdbc:calcite:model=resources/model.json"
            :user "admin"
            :password "admin"}
        ds (jdbc/get-datasource db)]
(jdbc/execute! ds ["select * from emps where age is null or age >= 40"])))

and get back SQL results.

Part of the magic is in model.json file.
It uses ro.ieugen.calcite.clj.SchemaFactory and it has an operand property
 "clojure-clj.schema-factory": "ro.ieugen.calcite-csv/csv-schema" .

This property is a reference to the Clojure namespace (ro.ieugen.calcite-csv) and function (csv-schema) to call for generating the Schema.

The schema factory is generic and if there is interest I would like to contribute it upstream.

It allows the use of Clojure functions to be used as Schema factories thus creating a bridge to Clojure in a seamless way.


Full model.json bellow:

```
{
    "version": "1.0",
    "defaultSchema": "SALES",
    "schemas": [
      {
        "name": "SALES",
        "type": "custom",
        "factory": "ro.ieugen.calcite.clj.SchemaFactory",
        "operand": {
          "clojure-clj.schema-factory": "ro.ieugen.calcite-csv/csv-schema",
          "directory": "resources/sales"
        }
      }
    ]
  }

```
--
Eugen Stan

+40770 941 271  / https://www.netdava.com
begin:vcard
fn:Eugen Stan
n:Stan;Eugen
email;internet:eugen.s...@netdava.com
tel;cell:+40720898747
x-mozilla-html:FALSE
url:https://www.netdava.com
version:2.1
end:vcard

Reply via email to