Metadata-Version: 2.4
Name: cdmduck
Version: 0.0.1
Summary: OMOP CDM / OHDSI ATLAS-compatible tools on DuckDB: SqlRender, Circe and a WebAPI-compatible server in pure Python
Author-email: Hyung-Chul Lee <lucid80@gmail.com>
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/vitaldb/cdmduck
Project-URL: Source, https://github.com/vitaldb/cdmduck
Keywords: omop,cdm,ohdsi,atlas,sqlrender,circe,duckdb
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Healthcare Industry
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Database
Classifier: Topic :: Scientific/Engineering :: Medical Science Apps.
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: NOTICE
Provides-Extra: server
Requires-Dist: duckdb>=1.0; extra == "server"
Requires-Dist: fastapi; extra == "server"
Requires-Dist: uvicorn; extra == "server"
Dynamic: license-file

<p align="center"><img src="https://raw.githubusercontent.com/vitaldb/cdmduck/main/docs/logo.png" alt="cdmduck" width="320"></p>

# cdmduck

**OMOP data. Simpler. Faster. Everywhere.** — OHDSI ATLAS-compatible tools for the OMOP CDM,
in pure Python on DuckDB. No Java, no Postgres, no Docker.

OMOP CDM · OHDSI ATLAS 호환 도구를 DuckDB 위에서, 순수 파이썬으로.

```
pip install cdmduck
```

| 모듈 | 원본 (OHDSI, Apache 2.0) | 상태 |
|---|---|---|
| `cdmduck.sqlrender` | SqlRender (Java) | 이식 완료 — Java 판과 58,440 건 글자 단위 일치 |
| `cdmduck.circe` | circe-be (Java) | 예정 |
| `cdmduck.webapi` | WebAPI 3.0 (Java) — ATLAS 3.0 화면이 부르는 API | 예정 |

```python
from cdmduck.sqlrender import render, translate
sql = render("SELECT TOP 10 * FROM @cdm.person {@adult}?{WHERE year_of_birth < 2000};", cdm="main", adult=True)
translate(sql, "duckdb")   # SELECT  * FROM main.person WHERE year_of_birth < 2000 LIMIT 10;
```

```
cdmduck translate query.sql duckdb -p cdm=main
cdmduck dialects
```

## Java 판과의 동등성 검증

`tests/equiv/` — SqlRender R 테스트 문자열 2,009개, Circe·WebAPI SQL 763개(×16 방언·렌더·분할),
합성 조건식 3,000개를 Java 원본(`tests/java`, JDK 22+ 소스 실행)과 이 이식본에 넣어 결과를 비교한다.

```
python3 tests/equiv/build_corpus.py <클론 디렉터리> cases.tsv
python3 tests/equiv/run_java.py cases.tsv java.out 24
PYTHONPATH=src python3 tests/equiv/py_harness.py cases.tsv py.out 32
python3 tests/equiv/diff.py cases.tsv java.out py.out
```

알려진 차이: Java 내부 예외(EmptyStack, ArrayIndexOutOfBounds)의 메시지 문구만 다르다(예외가 나는 자리는 같다).
BMP 밖 문자(이모지 등)는 Java 가 UTF-16 대리쌍 둘로 보므로 위치가 달라질 수 있다.

## 라이선스

Apache 2.0. `src/cdmduck/sqlrender/csv/replacementPatterns.csv` 와 `ref/java`, `tests/java/org` 는
OHDSI SqlRender 에서 가져왔다(`third_party/`, `NOTICE`).
