Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Compile Cypher to SQLite's SQL, reads and writes

オープン
#93 コメント 1 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
5/5
見積もり時間
1週間以上
初心者へのやさしさ
25/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python, sqlite
領域
backend, databases

調査の方向性

Start with the shared SQL compiler, the SQLite store from #80, and the shared spec for queries, writes, temporal behavior, and refusals. Then review the SQLite cross-engine contracts, noting which tests need a second writer and cannot run under SQLite's write lock. Done means the Cypher compiler, registered SQLite functions, serialized write steps, and stated test contracts work together.

索引モデルが issue の本文から書いたものです。

説明

Port of liberation-data/drivine4j203: the Cypher compiler's SQLite target, so a Cypher statement runs on a SQLite graph and gives the rows a graph engine gives. It builds on the SQLite store (#80).

What drivine4j does

  • A third dialect of the shared SQL compiler, beside Postgres and Oracle. A compiled statement opens with /* drivine:json */, so its text values are read as JSON.
  • Values are JSON text. A value that passes through a subquery is text again, so it is wrapped in json(…) wherever it goes into json_array, json_object, json_group_array or json_set.
  • Functions registered on each connection do what SQLite's JSON functions don't:
    • drivine_equal(a, b): Cypher equality. 1 equals 1.0, maps compare in any key order, null gives null.
    • drivine_contains(props, map): a pattern's map of properties.
    • drivine_add(a, b): + of numbers, lists (a null is taken as an item) and texts.
    • drivine_canonical(json): maps' keys in order, so DISTINCT and grouping treat two maps of the same entries as one.
    • drivine_upper, drivine_split, drivine_reverse, drivine_uuid.
    • drivine_regex_group, drivine_regexp_replace (groups written \1).
    • drivine_trunc: whole where it fits. A real within 2 ulps of a whole number counts as that number.
    • drivine_to_char: the to_char patterns the temporal SQL uses.
    • drivine_temporal(op, …): local, utc, extract, add_months, add_time, months_between, seconds_between, truncate.
  • Timestamps are fixed-width ISO text, YYYY-MM-DDTHH:MM:SS.ffffff. The statement's clock is a literal taken as it is compiled, so one statement reads one clock.
  • No LATERAL. An OPTIONAL MATCH, a CALL { … }, a walk or a shortest path gathers its rows as a JSON list of maps in a subquery: json_each((SELECT json_group_array(json_object(…)) FROM (…) q)). That subquery can read the outer row. Each column is read back with -> (JSON, NULLIF(…, 'null')) or ->>.
  • Id lists are ,1,2, text, as on Oracle.
  • An order puts nulls NULLS LAST ascending and NULLS FIRST descending. It sorts by x ->> '$'.
  • Writes are a procedure of steps: select-into, let, loop over a query's rows, if, raise, execute (RETURNING … INTO), return. The steps are serialised as JSON. Each variable a step's SQL reads becomes a numbered parameter (?1); literals and quoted names are skipped. drivine_cypher(steps, params) carries the steps out on the statement's connection under a SAVEPOINT.
  • =~ is text REGEXP ('^(?:' || pattern || ')\z').

Tests

  • Run the shared spec on SQLite: queries, writes, temporal, refusals.
  • Run the cross-engine contracts that seed in Cypher.
  • Contract tests that need a second writer inside an open transaction can't run on SQLite: a transaction holds the write lock from BEGIN IMMEDIATE.
主要言語
Python
スター
1
フォーク
0
平均マージ
1時間 16分
マージ済み PR(30日)
74

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

liberation-data/drivine-python のほかの issue

liberation-data/drivine-python の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。