Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
aed8433
Add java-services
corovcam Mar 9, 2026
ce4f8d9
Add scaffolded services
corovcam Mar 10, 2026
e9b5f0a
feat: Introduce orchestrator service with Docker setup, agent context…
corovcam Mar 11, 2026
0e88a9f
feat: Introduce .NET service and configure orchestrator with SSH tunn…
corovcam Mar 11, 2026
5c9f3be
Docker changes
corovcam Mar 12, 2026
0a67fec
Refactor code structure for improved readability and maintainability
corovcam Mar 12, 2026
f02cf0d
feat: introduce react_agent with configurable LLM context and custom …
corovcam Mar 16, 2026
f067cb9
feat: Introduce initial ReAct agent with custom .NET, Java, and MCP d…
corovcam Mar 16, 2026
3251b52
Sample tests
corovcam Mar 16, 2026
3394946
feat: Fix prompts, context, tests
corovcam Mar 18, 2026
03469f5
feat: Simplify initial React agent implementation including utilities…
corovcam Mar 19, 2026
da48367
format, lint
corovcam Mar 19, 2026
06a4cdc
Config changes
corovcam Mar 20, 2026
ef50c3d
feat: Add .gitattributes for automatic text handling and LF line endi…
corovcam Mar 21, 2026
4933ae1
feat: Add ETL services for WideWorldImporters data to Neo4j and Mongo…
corovcam Mar 23, 2026
c90d25c
feat: Externalize service configurations and credentials into environ…
corovcam Mar 23, 2026
7d9d88a
feat: Add orchestrator service with react agent, including its core c…
corovcam Mar 23, 2026
c735ef7
feat: Implement initial docs_search and mcp_database tools
corovcam Mar 23, 2026
9516668
feat: Enhance orchestrator service with SSH tools, MongoDB integratio…
corovcam Mar 25, 2026
3a53169
feat: Add integration tests for MCP database tools and orchestrator t…
corovcam Mar 25, 2026
fbac54a
Config MCP toolbox; MongoDB MCP; update context, configs
corovcam Mar 27, 2026
35ae160
feat: Add devcontainer configuration, update VSCode settings, and imp…
corovcam Mar 27, 2026
fc82654
Trying to fix MCP servers
corovcam Mar 29, 2026
bb16309
fix mongodb MCP; update database tools and orchestrator graph
corovcam Mar 29, 2026
a23d048
feat: Update devcontainer and VSCode settings; add Node.js setup scri…
corovcam Mar 30, 2026
de863da
Update docs
corovcam Mar 30, 2026
ce3516a
fix: Update .gitignore files and add SQLTools connection settings in …
corovcam Apr 2, 2026
b255c16
docs: Update README files to enhance project description and clarify …
corovcam Apr 2, 2026
22936c3
Reimplement java-service with dynamic compilation support and maven f…
corovcam Apr 5, 2026
7dd9f7a
Initial java validator impl
corovcam Apr 5, 2026
3c209ad
Java validation fix for maven; tests
corovcam Apr 7, 2026
cecd89a
Sample integration test
corovcam Apr 7, 2026
6ebee72
Integrate java_validator; fixes
corovcam Apr 7, 2026
21d6bff
Add project specification
corovcam Apr 8, 2026
24908f6
Refactor validation methods to use findOne for MongoDB and Neo4j queries
corovcam Apr 8, 2026
50c9d97
feat: enhance orchestrator with Qwen3.5-122b support, improved model …
corovcam Apr 9, 2026
193cdec
refactor: update model naming conventions, expand MCP tool restrictio…
corovcam Apr 11, 2026
79b09b3
fully working schema translation pipeline
corovcam Apr 11, 2026
8452907
Refactor code structure for improved readability and maintainability
corovcam Apr 20, 2026
c0ef493
feat: add MongoDB and Neo4j standalone mapping functions with corresp…
corovcam Apr 20, 2026
80c2ef9
feat: implement LoggingCallbackHandler and LLMRequestLogger for enhan…
corovcam Apr 20, 2026
619e052
fix: update debug command in Makefile to include wait-for-client option
corovcam Apr 20, 2026
ccc9ade
Graph updates; extract_input agent update
corovcam Apr 20, 2026
9a06cf3
feat: add installation scripts for Logdy and Node.js, and update Make…
corovcam Apr 21, 2026
d549872
feat: enhance request logging with truncation and add query validatio…
corovcam Apr 22, 2026
5e4cddd
feat: add query validation tools for source and target equivalence ch…
corovcam Apr 22, 2026
335e7e4
refactor: replace council of models node with explicit schema and que…
corovcam Apr 22, 2026
6961c6a
Update dependencies and refactor code for improved functionality
corovcam Apr 25, 2026
b35d578
fix from unprecise EXPLAIN estimatedRowCount to full COUNT query
corovcam Apr 25, 2026
9e6178e
Add entrypoints as context code snippets
corovcam Apr 26, 2026
353f874
Update .gitignore
corovcam Apr 26, 2026
3602ba9
Small tweaks to entrypoints
corovcam Apr 26, 2026
f5d3b97
update sandboxes with new projects
corovcam Apr 27, 2026
1deba24
Refactor MongoQueryEntrypoint and EFCoreQueryEntrypoint for improved …
corovcam Apr 27, 2026
5cf8903
enhance query handling in Dapper and NHibernate entrypoints; refactor…
corovcam Apr 27, 2026
296fa24
Add Dapper, EF Core, and NHibernate sandboxes
corovcam Apr 27, 2026
ec82d39
Add launch settings for NHibernate sandbox and enhance Neo4j ETL scri…
corovcam Apr 28, 2026
a199307
Enhance serialization in Neo4j and MongoQueryEntrypoints; add support…
corovcam Apr 28, 2026
8ed596b
Refactor MongoQueryEntrypoint to improve query structure and harness …
corovcam Apr 28, 2026
8d0b0bb
Add custom JSON converters for decimal and double types; implement cu…
corovcam Apr 28, 2026
d0cf995
fix query2
corovcam Apr 28, 2026
34fc3d6
add snippets to orchestrator
corovcam Apr 28, 2026
4b46e0c
type fixes
corovcam Apr 28, 2026
640ebdf
modify Dockerfiles only for the SSH server
corovcam Apr 29, 2026
8ab771f
Add schema entrypoints; modify query ones a bit
corovcam May 1, 2026
d06f07d
Updated query entrypoints to include entity validations. Enhanced sch…
corovcam May 1, 2026
1695511
small changes to entrypoints
corovcam May 2, 2026
46201be
Move to full entrypoint code generation; remove validation services s…
corovcam May 4, 2026
0b5040b
Fix and implement new test; add deps; fix configs
corovcam May 10, 2026
f89c85c
Integrate Daytona sandbox library; remove deprecated ssh_tools; dynam…
corovcam May 10, 2026
0c22f9f
feat: add proxy DNS setup scripts, integrate Logfire requests instrum…
corovcam May 12, 2026
55c5f32
Switch to Daytona Sandboxes: modularize code validation tools, update…
corovcam May 12, 2026
5adf6b3
refactor: fix java and docker sandbox executions and scripts
corovcam May 12, 2026
05b5be1
update validation tools to include full output and support swapped qu…
corovcam May 12, 2026
1080a7e
refactor: decompose BaseTranslationOutput into specialized models and…
corovcam May 12, 2026
f250a47
fix small issues
corovcam May 12, 2026
055a545
fix slow graph loading; neo pom
corovcam May 12, 2026
a20c7fc
Fix generation speed exponentially
corovcam May 12, 2026
d6c1928
update deps; remove redundant MongoDB collection listing tool
corovcam May 12, 2026
f59e430
feat: implement Redis caching for LLM and graph states, add productio…
corovcam May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/universal
{
"name": "Default Linux Universal",
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
"image": "mcr.microsoft.com/devcontainers/universal:5-linux",
"features": {
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {},
"ghcr.io/devcontainers/features/python:1": {},
"ghcr.io/devcontainers/features/dotnet:2": {},
"ghcr.io/stu-bell/devcontainer-features/gemini-cli:0": {},
"ghcr.io/devcontainers-extra/features/shellcheck:1": {},
"ghcr.io/devcontainers-extra/features/uv:1": {},
"ghcr.io/devcontainers-extra/features/direnv:1": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
}
},
"customizations": {
"vscode": {
"extensions": [
"ms-dotnettools.csdevkit",
"ms-azuretools.vscode-containers",
"Upstash.context7-mcp",
"mads-hartmann.bash-ide-vscode",
"fill-labs.dependi",
"docker.docker",
"tamasfe.even-better-toml",
"vscjava.vscode-java-pack",
"PKief.material-icon-theme",
"Postman.postman-for-vscode",
"charliermarsh.ruff",
"mtxr.sqltools",
"redhat.vscode-yaml",
"astral-sh.ty"
]
}
}

// Features to add to the dev container. More info: https://containers.dev/features.
// "features": {},

// Use 'forwardPorts' to make a list of ports inside the container available locally.
// "forwardPorts": [],

// Use 'postCreateCommand' to run commands after the container is created.
// "postCreateCommand": "uname -a",

// Configure tool-specific properties.
// "customizations": {},

// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
// "remoteUser": "root"
}
20 changes: 20 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
XRG13_SSH_USERNAME=
XRG13_SSH_PRIVATE_KEY_PATH=~/.ssh/id_rsa # change to valid path

OLLAMA_PORT=11434
DOTNET_SERVICE_PORT=5083
JAVA_SERVICE_PORT=8090
MONGODB_MIGRATOR_PORT=8091
DB_TOOLBOX_PORT=5010

MSSQL_PORT=1444
MSSQL_USER=sa
MSSQL_PASSWORD=Testingorms123
MONGODB_PORT=27027
MONGODB_USER=uom_readonly
MONGODB_PASSWORD=uom_readonly
MONGODB_DATABASE=uom
NEO4J_PORT=7697
NEO4J_BROWSER_PORT=7484
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=password
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* text=auto

*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
*.sh text eol=lf
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
*.bkp
.gemini/
gha-creds-*.json
.env
.env.dev
/.idea/
*.dump
.serena/
70 changes: 70 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Neo4jSchemaValidationEntrypoint",
"request": "launch",
"mainClass": "uom.services.Neo4jSchemaValidationEntrypoint",
"projectName": "neo4j_sandbox",
"envFile": "${workspaceFolder}/services/java-services/.env.dev"
},
{
"type": "java",
"name": "MongoSchemaValidationEntrypoint",
"request": "launch",
"mainClass": "uom.services.MongoSchemaValidationEntrypoint",
"projectName": "mongo_sandbox",
"envFile": "${workspaceFolder}/services/java-services/.env.dev"
},
{
"type": "java",
"name": "MongoQueryEntrypoint",
"request": "launch",
"mainClass": "uom.services.MongoQueryEntrypoint",
"projectName": "mongo_sandbox",
"envFile": "${workspaceFolder}/services/java-services/.env.dev"
},
{
"type": "java",
"name": "Neo4jQueryEntrypoint",
"request": "launch",
"mainClass": "uom.services.Neo4jQueryEntrypoint",
"projectName": "neo4j_sandbox",
"envFile": "${workspaceFolder}/services/java-services/.env.dev"
},
{
"name": "[orchestrator] Python Debugger: Remote Attach",
"type": "debugpy",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"justMyCode": false,
"pathMappings": [
{
"localRoot": "${workspaceFolder}/services/orchestrator",
"remoteRoot": "."
}
]
},
{
"name": "C#: Debug Active File",
"type": "dotnet",
"request": "launch",
"projectPath": "${file}",
"linux": {
"args": [
"Server=localhost,1444;Database=WideWorldImporters;User Id=sa;Password=Testingorms123;TrustServerCertificate=True"
],
"env": {
"CONNECTION_STRING": "Server=localhost,1444;Database=WideWorldImporters;User Id=sa;Password=Testingorms123;TrustServerCertificate=True",
"EFCORE_RESULTS_PATH": "/home/corovcak/Uni/DP/Universal-Object-Mapping/services/dotnet-service/efcore-sandbox/results",
"NHIBERNATE_RESULTS_PATH": "/home/corovcak/Uni/DP/Universal-Object-Mapping/services/dotnet-service/nhibernate-sandbox/results",
"DAPPER_RESULTS_PATH": "/home/corovcak/Uni/DP/Universal-Object-Mapping/services/dotnet-service/dapper-sandbox/results"
}
}
}
]
}
65 changes: 65 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
{
"java.compile.nullAnalysis.mode": "automatic",
"java.configuration.updateBuildConfiguration": "automatic",
"python-envs.pythonProjects": [
{
"path": "./services/orchestrator",
"envManager": "ms-python.python:venv",
"packageManager": "ms-python.python:pip"
}
],
"python.analysis.useNearestConfiguration": true,
"python.analysis.include": ["./services/orchestrator/[src,tests]/**"],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
"pythonTestExplorer.testFramework": "pytest",
"python.envFile": "${workspaceFolder}/services/orchestrator/.env.dev",
"python.testing.cwd": "${workspaceFolder}/services/orchestrator",
"python.testing.autoTestDiscoverOnSaveEnabled": true,
"python.testing.autoTestDiscoverOnSavePattern": "${workspaceFolder}/services/orchestrator/tests/**/*.py",
"python.terminal.useEnvFile": true,
"python.testing.pytestPath": "${workspaceFolder}/services/orchestrator/.venv/bin/pytest",
"python.testing.pytestArgs": [
"-v",
"${workspaceFolder}/services/orchestrator/tests"
],
"python.analysis.inlayHints.pytestParameters": true,
// "python.languageServer": "Pylance",
// if using Pylance in VSCode
"ty.disableLanguageServices": false,
"sqltools.connections": [
{
"ssh": "Disabled",
"previewLimit": 50,
"server": "localhost",
"port": 5433,
"driver": "PostgreSQL",
"name": "langgraph-postgres",
"database": "postgres",
"username": "postgres",
"password": "postgres"
},
{
"connectionTimeout": 15,
"mssqlOptions": {
"appName": "SQLTools",
"useUTC": true,
"encrypt": true,
"trustServerCertificate": true
},
"ssh": "Disabled",
"previewLimit": 50,
"server": "localhost",
"port": 1444,
"driver": "MSSQL",
"name": "uom-mssql",
"username": "sa",
"password": "Testingorms123"
}
],
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
"maven.view": "flat",
"java.sources.organizeImports.staticStarThreshold": 1
}
59 changes: 59 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/services/dotnet-service/dotnet-service.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/services/dotnet-service/dotnet-service.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/services/dotnet-service/dotnet-service.sln"
],
"problemMatcher": "$msCompile"
},
{
"label": "fix /run/user/1000",
"type": "shell",
"command": "sudo mkdir /run/user/1000 && sudo chown -R $USER:$USER /run/user/1000",
"problemMatcher": []
},
{
"label": "Setup Windows proxy DNS for Daytona",
"type": "shell",
"command": "sudo.exe powershell -ExecutionPolicy Bypass -File ./services/orchestrator/scripts/daytona-setup-proxy-dns.ps1",
"problemMatcher": []
},
{
"label": "Reset Windows proxy DNS for Daytona",
"type": "shell",
"command": "sudo.exe powershell -ExecutionPolicy Bypass -File ./services/orchestrator/scripts/daytona-reset-proxy-dns.ps1",
"problemMatcher": []
},
]
}
9 changes: 9 additions & 0 deletions ORMConvertor/README.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,36 @@
# ORMConvertor

A web-based tool for translating accross different .NET ORMs.

# Deployment

The application can be run in two main ways. The more user-friendly approach is to open the solution file `ORMConvertor.sln` in Visual Studio. `ORMConvertorAPI` has to be set as the startup project, if not selected by default. The app can be launched in `Debug` configuration for development or compiled in `Release` configuration for production. Only the `http` launch profile defined in `ORMConvertorAPI/Properties/launchSettings.json` file has been configured and tested. The application can be started with `CTRL + F5` to run without debugging or `F5` to launch with the debugger. A browser window should open automatically.

Alternatively, the application can be started using .NET CLI using the following commands:

```sh
dotnet run --configuration Release --launch-profile http --project ORMConvertorAPI/ORMConvertorAPI.csproj
```

This approach does not open a browser automatically. Instead, the local URL is printed to the console (typically [http://localhost:5072/orm/](http://localhost:5072/orm/)).

Tests can be executed via the Visual Studio's Test Explorer window or with a .NET CLI command:

```sh
dotnet test Tests/Tests.csproj --configuration Release
```

The output displays the results of succeeded and failed tests. Tests are also run automatically on each commit using a GitHub Actions pipeline. The pipeline configuration is located in the `.github` folder at the root of the repository.

The Angular frontend is precompiled and served by the ASP.NET web server running the API. To prepare the frontend, its source files must be compiled and copied to the `wwwroot` directory, from which they are served as static files. This process is performed by executing the following commands in the `ORMConvertorAPI/frontend` directory.

```sh
npm install
ng build --configuration "production" --base-href "/orm/" --deploy-url "/orm/" && rmdir /s /q "..\wwwroot" && mkdir "..\wwwroot" && xcopy /s /e /y "dist\browser\*" "..\wwwroot\"
```

For Linux:

```sh
npm install
ng build --configuration "production" --base-href "/orm/" --deploy-url "/orm/" && rm -rf "../wwwroot" && mkdir "../wwwroot" && cp -r dist/browser/* ../wwwroot/
Expand Down
54 changes: 39 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,55 @@
# Universal Object Mapping
# Universal Object Mapping (UOM)

[![ORMConvertor tests](https://github.com/corovcam/Universal-Object-Mapping/actions/workflows/ormconvertor-tests.yml/badge.svg)](https://github.com/corovcam/Universal-Object-Mapping/actions/workflows/ormconvertor-tests.yml)

## Repository structure
Universal Object Mapping (UOM) is a research project focused on automating the translation and optimization of database schemas and queries across diverse Object-Relational/Document/Graph Mapping (ORM/ODM/OGM) frameworks.

The repository is structured into several directories. The `diagrams` directory holds diagrams created using [draw.io](https://www.drawio.com/). Experimental comparisons, including unit tests and benchmarks, are located in the `benchmarks` directory. The `ORMConvertor` folder includes a prototype tool for translating between different .NET ORM frameworks.
The project leverages an **LLM-driven iterative translation architecture** to bridge the gap between relational, document, and graph databases. It extends the earlier work of ORMorpher, replacing its heuristic rule engine with an LLM-driven pipeline.

## ORMConvertor
## Key Features

The translation and advisor tool are currently hosted at [http://116.203.208.55/orm/home](http://116.203.208.55/orm/home).
- **Automated Translation**: Migrate .NET (EF Core, Dapper, NHibernate) entity mappings and LINQ queries to Java Spring Data (MongoDB, Neo4j).
- **LLM Orchestration**: Uses a ReAct agent powered by LangGraph for autonomous code generation, validation, and correction with tool calls.
- **Isolated Benchmarking**: Measures ORM overhead (mapping/translation) independently of database latency via a specialized mocking layer.
- **Intelligent Advisor**: Suggests optimal ORM/ODM configurations using Integer Linear Programming (ILP) based on benchmark data.
- **Multi-Database Support**: MS SQL Server (relational), MongoDB (document), and Neo4j (graph) integration.
- **ETL Pipelines**: Pre-configured ETL processes to map and load data from relational schemas to NoSQL targets.

## Frameworks and ORM/OGM/ODMs compared
## Architecture

The compared ORMs are:
The system is built as a set of modular microservices and tools coordinated by a Python-based orchestrator, managed via Docker Compose.

- [Dapper](https://github.com/DapperLib/Dapper)
- [NHibernate](https://github.com/nhibernate)
- [Entity Framework Core](https://github.com/dotnet/efcore)
- **Orchestrator (`services/orchestrator`)**: Python/LangGraph service driving the translation workflow using a "Council of Models" and a ReAct agent.
- **Service Layer**:
- **[.NET Service](services/dotnet-service)**: Compilation and validation for C# (EF Core, NHibernate, Dapper).
- **[Java Service](services/java-services)**: Compilation and validation for Java (Spring Data MongoDB, Spring Data Neo4j).
- **[ORMConvertor](ORMConvertor/)**: The original .NET-based tool providing the web UI, heuristic reference logic, and the ILP-based Advisor.
- **[Benchmarks](benchmarks/)**: A comprehensive suite for measuring ORM performance.

The compared OGMs are:
Detailed architectural documentation can be found in [**notes/architecture.md**](notes/architecture.md).

- [Spring Data Neo4j](https://github.com/spring-projects/spring-data-neo4j)
## Getting Started

The compared ODMs are:
### Prerequisites

- [Spring Data MongoDB](https://github.com/spring-projects/spring-data-mongodb)
- [Docker Desktop](https://www.docker.com/products/docker-desktop/) or Docker Engine with Compose
- [.NET 8 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) (or 10.0)
- [Python 3.11+](https://www.python.org/) (managed with [uv](https://astral.sh/uv/))
- [OpenJDK 25+](https://jdk.java.net/25/) and [Maven](https://maven.apache.org/download.cgi) (for Java services)
- [Node.js 24](https://nodejs.org/en/download/) (for Frontend)

### Development Setup

## Acknowledgements
1. **Spin up the stack**:
```bash
docker compose up -d --build
```
2. **Configure Environment**:
Copy `.env.example` to `.env` and configure your LLM provider keys (Ollama or OpenAI-compatible like E-Infra vLLM).

3. **Explore Documentation**:
- [Project Specification (LaTeX)](notes/project-specification/specification-llm-advisor.tex)
- [C4 Architecture Diagrams](notes/architecture)

## Acknowledgements
Part of the `ORMConvertor` and the `benchmarks` source code, including some workflows and diagrams, were developed by Milan Abrahám as part of his Master thesis titled _Framework-Agnostic Query Adaptation: Ensuring SQL Compatibility Across .NET Database Frameworks_. The thesis is available at http://hdl.handle.net/20.500.11956/203083, and the source code is available at https://github.com/milan252525/orm-convertor.
Loading
Loading