Skip to content
Merged
Show file tree
Hide file tree
Changes from 61 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
b0fa59c
RDF, cleanup relations and remove unnecessary bindings, add distribut…
harshach Apr 1, 2026
5d9a6a9
Merge branch 'main' into rdf_v2
harshach Apr 1, 2026
b0aef60
Update generated TypeScript types
github-actions[bot] Apr 1, 2026
7d46a65
Merge branch 'main' into rdf_v2
harshach Apr 1, 2026
156f039
Address comments from copilot
harshach Apr 1, 2026
4a1e083
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 1, 2026
e0f35aa
Update generated TypeScript types
github-actions[bot] Apr 1, 2026
1f22b97
Merge remote-tracking branch 'origin/main' into rdf_v2
aniketkatkar97 Apr 2, 2026
e259ec0
fix test issues
harshach Apr 2, 2026
fabade4
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 2, 2026
ec70141
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 6, 2026
2841a12
Fix minor UI bugs
aniketkatkar97 Apr 6, 2026
88672fc
Add the missing filters
aniketkatkar97 Apr 6, 2026
8448869
Fix RDF export API error
aniketkatkar97 Apr 6, 2026
31b761d
Add export functionality
aniketkatkar97 Apr 7, 2026
e29eea2
Fix ui-checkstyle
aniketkatkar97 Apr 7, 2026
cfc7769
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 7, 2026
bed18d9
Fix java checkstyle
aniketkatkar97 Apr 7, 2026
706a3fc
Fix unit tests
aniketkatkar97 Apr 7, 2026
5273179
Fix and increase the coverage for KnowledgeGraph.spec.ts
aniketkatkar97 Apr 7, 2026
1062f0c
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 7, 2026
1452a2f
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 7, 2026
fb1efe5
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 7, 2026
6c2a1e1
Merge remote-tracking branch 'origin/main' into rdf_v2
harshach Apr 7, 2026
7dd2925
Fix tests
harshach Apr 7, 2026
30b8d0b
Merge branch 'main' into rdf_v2
harshach Apr 7, 2026
49cca4c
Remove rdf as default in playwright and local docker
harshach Apr 8, 2026
8a5de75
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 8, 2026
0f91604
Merge remote-tracking branch 'origin/main' into rdf_v2
aniketkatkar97 Apr 9, 2026
3664b0e
fix ui-checkstyle
aniketkatkar97 Apr 10, 2026
0e4df9c
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 10, 2026
33abb30
Address comments
harshach Apr 11, 2026
1f32af1
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 11, 2026
dcd2b4c
Merge remote-tracking branch 'origin/main' into rdf_v2
harshach Apr 11, 2026
8ff7aae
Potential fix for pull request finding 'CodeQL / Artifact poisoning'
harshach Apr 11, 2026
82c6a23
Address copilot comments
harshach Apr 11, 2026
b73e7f5
Address copilot comments
harshach Apr 11, 2026
8814747
FIx tests
harshach Apr 12, 2026
5b89ec2
Merge branch 'main' into rdf_v2
harshach Apr 12, 2026
cfacda1
FIx docker
harshach Apr 12, 2026
d84a8d7
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 12, 2026
e3f0f5d
Update openmetadata-service/src/main/java/org/openmetadata/service/ap…
harshach Apr 12, 2026
3037499
Address copilot review comments: license headers, JSON escaping, type…
Copilot Apr 12, 2026
835debc
Show error toast for unsupported export format in KnowledgeGraph
Copilot Apr 12, 2026
54c177f
Fix docker
harshach Apr 12, 2026
4d4b807
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 12, 2026
7a34b67
Fix docker for playwright
harshach Apr 12, 2026
22cb1bc
Fix docker for playwright
harshach Apr 12, 2026
ae5bf8f
Fix tests
harshach Apr 13, 2026
b3c792e
Fix tests
harshach Apr 13, 2026
986101c
Fix docker
harshach Apr 13, 2026
c69ac4f
Fix docker
harshach Apr 13, 2026
1a94234
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 13, 2026
2432c3a
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 13, 2026
4bddb71
Fix glossary and pagination spec flakiness
aniketkatkar97 Apr 13, 2026
6ab8c15
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 13, 2026
7375993
update the missing translations
aniketkatkar97 Apr 13, 2026
aee1f34
Fix docker
harshach Apr 14, 2026
c3c4255
Merge remote-tracking branch 'origin/rdf_v2' into rdf_v2
harshach Apr 14, 2026
a092978
Fix docker
harshach Apr 14, 2026
c855b49
Fix integration test
aniketkatkar97 Apr 14, 2026
e984879
Fix fuseki not starting
aniketkatkar97 Apr 14, 2026
38d8ccf
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 14, 2026
df8374c
Fixed the run local docker script
aniketkatkar97 Apr 14, 2026
fb4406b
worked on comments
aniketkatkar97 Apr 14, 2026
8c97479
Merge branch 'main' into rdf_v2
aniketkatkar97 Apr 14, 2026
f6123c4
Fix flakiness in knowledge graph tests
aniketkatkar97 Apr 14, 2026
2058a5f
Fix checkstyle
aniketkatkar97 Apr 14, 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
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
docker/development/docker-volume
docker/docker-compose-quickstart/docker-volume
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ inputs:
description: Arguments to pass to run_local_docker.sh
required: false
default: "-m no-ui -d mysql" # Use "-d postgresql" for postgres and Opensearch
startup-script:
description: Startup script used to launch the local OpenMetadata test environment
required: false
default: "./docker/run_local_docker.sh"
ingestion_dependency:
description: Ingestion dependency to pass to run_local_docker.sh
required: false
Expand Down Expand Up @@ -97,4 +101,4 @@ runs:
timeout_minutes: 60
max_attempts: 2
retry_on: error
command: ./docker/run_local_docker.sh ${{ inputs.args }}
command: ${{ inputs.startup-script }} ${{ inputs.args }}
209 changes: 209 additions & 0 deletions .github/workflows/playwright-knowledge-graph-postgresql-e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
# Copyright 2021 Collate
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Postgresql PR Knowledge Graph E2E Tests
on:
workflow_dispatch:
pull_request:
types:
- opened
- synchronize
- reopened
- ready_for_review
paths:
- ".github/actions/setup-openmetadata-test-environment/action.yml"
- ".github/workflows/playwright-knowledge-graph-postgresql-e2e.yml"
- "docker/run_local_docker.sh"
- "docker/run_local_docker_common.sh"
- "docker/run_local_docker_rdf.sh"
- "docker/validate_compose.py"
- "docker/development/docker-compose-fuseki.yml"
- "docker/development/docker-compose-postgres-fuseki.yml"
- "docs/rdf-local-development.md"
- "openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/**"
- "openmetadata-service/src/main/java/org/openmetadata/service/rdf/**"
- "openmetadata-service/src/main/java/org/openmetadata/service/resources/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/apps/bundles/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/rdf/**"
- "openmetadata-service/src/test/java/org/openmetadata/service/resources/rdf/**"
- "openmetadata-spec/src/main/resources/rdf/**"
- "openmetadata-ui/src/main/resources/ui/playwright/e2e/Features/KnowledgeGraph.spec.ts"
- "openmetadata-ui/src/main/resources/ui/playwright.config.ts"
- "openmetadata-ui/src/main/resources/ui/src/components/KnowledgeGraph/**"
- "openmetadata-ui/src/main/resources/ui/src/components/OntologyExplorer/**"
- "openmetadata-ui/src/main/resources/ui/src/rest/rdfAPI.ts"
- "openmetadata-ui/src/main/resources/ui/src/types/knowledgeGraph.types.ts"
- "openmetadata-ui/src/main/resources/ui/src/utils/TableUtils.tsx"

permissions:
contents: read

concurrency:
group: playwright-knowledge-graph-pr-postgresql-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Setup JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Cache Maven Dependencies
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-

- name: Install antlr cli
run: sudo make install_antlr_cli

- name: Build with Maven
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
run: mvn -DskipTests clean package

- name: Upload Maven build artifact
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
uses: actions/upload-artifact@v4
with:
name: openmetadata-build
path: openmetadata-dist/target/openmetadata-*.tar.gz
retention-days: 1

playwright-knowledge-graph-postgresql:
needs: [build]
runs-on: ubuntu-latest
if: ${{ !cancelled() && needs.build.result == 'success' && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }}
environment: test
steps:
- name: Free Disk Space (Ubuntu)
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: false
swap-storage: true
docker-images: false

- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Prepare temporary directory for Maven build artifact
run: mkdir -p "${{ runner.temp }}/openmetadata-build-artifact"

- name: Download Maven build artifact
uses: actions/download-artifact@v4
with:
name: openmetadata-build
path: ${{ runner.temp }}/openmetadata-build-artifact

- name: Copy Maven build artifact into workspace
run: |
mkdir -p openmetadata-dist/target
cp -a "${{ runner.temp }}/openmetadata-build-artifact/." openmetadata-dist/target/

- name: Setup Openmetadata Test Environment
uses: ./.github/actions/setup-openmetadata-test-environment
with:
python-version: "3.10"
args: "-d postgresql -s true"
startup-script: "./docker/run_local_docker_rdf.sh"
ingestion_dependency: "all"

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: "openmetadata-ui/src/main/resources/ui/.nvmrc"

- name: Install dependencies
working-directory: openmetadata-ui/src/main/resources/ui/
run: yarn --ignore-scripts --frozen-lockfile
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed

- name: Install Playwright Browsers
run: npx playwright@1.57.0 install chromium --with-deps

- name: Run Knowledge Graph Playwright tests
working-directory: openmetadata-ui/src/main/resources/ui/
run: npx playwright test --project="Knowledge Graph"
env:
PLAYWRIGHT_IS_OSS: true
PLAYWRIGHT_SNOWFLAKE_USERNAME: ${{ secrets.TEST_SNOWFLAKE_USERNAME }}
PLAYWRIGHT_SNOWFLAKE_PASSWORD: ${{ secrets.TEST_SNOWFLAKE_PASSWORD }}
PLAYWRIGHT_SNOWFLAKE_ACCOUNT: ${{ secrets.TEST_SNOWFLAKE_ACCOUNT }}
PLAYWRIGHT_SNOWFLAKE_DATABASE: ${{ secrets.TEST_SNOWFLAKE_DATABASE }}
PLAYWRIGHT_SNOWFLAKE_WAREHOUSE: ${{ secrets.TEST_SNOWFLAKE_WAREHOUSE }}
PLAYWRIGHT_SNOWFLAKE_PASSPHRASE: ${{ secrets.TEST_SNOWFLAKE_PASSPHRASE }}
PLAYWRIGHT_BQ_PRIVATE_KEY: ${{ secrets.TEST_BQ_PRIVATE_KEY }}
PLAYWRIGHT_BQ_PROJECT_ID: ${{ secrets.PLAYWRIGHT_BQ_PROJECT_ID }}
PLAYWRIGHT_BQ_PRIVATE_KEY_ID: ${{ secrets.TEST_BQ_PRIVATE_KEY_ID }}
PLAYWRIGHT_BQ_PROJECT_ID_TAXONOMY: ${{ secrets.TEST_BQ_PROJECT_ID_TAXONOMY }}
PLAYWRIGHT_BQ_CLIENT_EMAIL: ${{ secrets.TEST_BQ_CLIENT_EMAIL }}
PLAYWRIGHT_BQ_CLIENT_ID: ${{ secrets.TEST_BQ_CLIENT_ID }}
PLAYWRIGHT_REDSHIFT_HOST: ${{ secrets.E2E_REDSHIFT_HOST_PORT }}
PLAYWRIGHT_REDSHIFT_USERNAME: ${{ secrets.E2E_REDSHIFT_USERNAME }}
PLAYWRIGHT_REDSHIFT_PASSWORD: ${{ secrets.E2E_REDSHIFT_PASSWORD }}
PLAYWRIGHT_REDSHIFT_DATABASE: ${{ secrets.TEST_REDSHIFT_DATABASE }}
PLAYWRIGHT_METABASE_USERNAME: ${{ secrets.TEST_METABASE_USERNAME }}
PLAYWRIGHT_METABASE_PASSWORD: ${{ secrets.TEST_METABASE_PASSWORD }}
PLAYWRIGHT_METABASE_DB_SERVICE_NAME: ${{ secrets.TEST_METABASE_DB_SERVICE_NAME }}
PLAYWRIGHT_METABASE_HOST_PORT: ${{ secrets.TEST_METABASE_HOST_PORT }}
PLAYWRIGHT_SUPERSET_USERNAME: ${{ secrets.TEST_SUPERSET_USERNAME }}
PLAYWRIGHT_SUPERSET_PASSWORD: ${{ secrets.TEST_SUPERSET_PASSWORD }}
PLAYWRIGHT_SUPERSET_HOST_PORT: ${{ secrets.TEST_SUPERSET_HOST_PORT }}
PLAYWRIGHT_KAFKA_BOOTSTRAP_SERVERS: ${{ secrets.TEST_KAFKA_BOOTSTRAP_SERVERS }}
PLAYWRIGHT_KAFKA_SCHEMA_REGISTRY_URL: ${{ secrets.TEST_KAFKA_SCHEMA_REGISTRY_URL }}
PLAYWRIGHT_GLUE_ACCESS_KEY: ${{ secrets.TEST_GLUE_ACCESS_KEY }}
PLAYWRIGHT_GLUE_SECRET_KEY: ${{ secrets.TEST_GLUE_SECRET_KEY }}
PLAYWRIGHT_GLUE_AWS_REGION: ${{ secrets.TEST_GLUE_AWS_REGION }}
PLAYWRIGHT_GLUE_ENDPOINT: ${{ secrets.TEST_GLUE_ENDPOINT }}
PLAYWRIGHT_GLUE_STORAGE_SERVICE: ${{ secrets.TEST_GLUE_STORAGE_SERVICE }}
PLAYWRIGHT_MYSQL_USERNAME: ${{ secrets.TEST_MYSQL_USERNAME }}
PLAYWRIGHT_MYSQL_PASSWORD: ${{ secrets.TEST_MYSQL_PASSWORD }}
PLAYWRIGHT_MYSQL_HOST_PORT: ${{ secrets.TEST_MYSQL_HOST_PORT }}
PLAYWRIGHT_MYSQL_DATABASE_SCHEMA: ${{ secrets.TEST_MYSQL_DATABASE_SCHEMA }}
PLAYWRIGHT_POSTGRES_USERNAME: ${{ secrets.TEST_POSTGRES_USERNAME }}
PLAYWRIGHT_POSTGRES_PASSWORD: ${{ secrets.TEST_POSTGRES_PASSWORD }}
PLAYWRIGHT_POSTGRES_HOST_PORT: ${{ secrets.TEST_POSTGRES_HOST_PORT }}
PLAYWRIGHT_POSTGRES_DATABASE: ${{ secrets.TEST_POSTGRES_DATABASE }}
PLAYWRIGHT_AIRFLOW_HOST_PORT: ${{ secrets.TEST_AIRFLOW_HOST_PORT }}
PLAYWRIGHT_ML_MODEL_TRACKING_URI: ${{ secrets.TEST_ML_MODEL_TRACKING_URI }}
PLAYWRIGHT_ML_MODEL_REGISTRY_URI: ${{ secrets.TEST_ML_MODEL_REGISTRY_URI }}
PLAYWRIGHT_S3_STORAGE_ACCESS_KEY_ID: ${{ secrets.TEST_S3_STORAGE_ACCESS_KEY_ID }}
PLAYWRIGHT_S3_STORAGE_SECRET_ACCESS_KEY: ${{ secrets.TEST_S3_STORAGE_SECRET_ACCESS_KEY }}
PLAYWRIGHT_S3_STORAGE_END_POINT_URL: ${{ secrets.TEST_S3_STORAGE_END_POINT_URL }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: playwright-knowledge-graph-report
path: openmetadata-ui/src/main/resources/ui/playwright/output/playwright-report
retention-days: 5

- name: Clean Up
if: always()
run: |
docker compose -f docker/development/docker-compose-postgres.yml -f docker/development/docker-compose-fuseki.yml down --remove-orphans || true
docker compose -f docker/development/docker-compose-postgres.yml down --remove-orphans || true
sudo rm -rf ${PWD}/docker/development/docker-volume
79 changes: 79 additions & 0 deletions bootstrap/sql/migrations/native/1.13.0/mysql/schemaChanges.sql
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,82 @@ SELECT ue.id, re.id, 'user', 'role', 10
FROM user_entity ue, role_entity re
WHERE ue.name = 'mcpapplicationbot'
AND re.name = 'ApplicationBotImpersonationRole';

-- RDF distributed indexing state tables
CREATE TABLE IF NOT EXISTS rdf_index_job (
id VARCHAR(36) NOT NULL,
status VARCHAR(32) NOT NULL,
jobConfiguration JSON NOT NULL,
totalRecords BIGINT NOT NULL DEFAULT 0,
processedRecords BIGINT NOT NULL DEFAULT 0,
successRecords BIGINT NOT NULL DEFAULT 0,
failedRecords BIGINT NOT NULL DEFAULT 0,
stats JSON,
createdBy VARCHAR(256) NOT NULL,
createdAt BIGINT NOT NULL,
startedAt BIGINT,
completedAt BIGINT,
updatedAt BIGINT NOT NULL,
errorMessage TEXT,
PRIMARY KEY (id),
INDEX idx_rdf_index_job_status (status),
INDEX idx_rdf_index_job_created (createdAt DESC)
);

CREATE TABLE IF NOT EXISTS rdf_index_partition (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
entityType VARCHAR(128) NOT NULL,
partitionIndex INT NOT NULL,
rangeStart BIGINT NOT NULL,
rangeEnd BIGINT NOT NULL,
estimatedCount BIGINT NOT NULL,
workUnits BIGINT NOT NULL,
priority INT NOT NULL DEFAULT 50,
status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
processingCursor BIGINT NOT NULL DEFAULT 0,
processedCount BIGINT NOT NULL DEFAULT 0,
successCount BIGINT NOT NULL DEFAULT 0,
failedCount BIGINT NOT NULL DEFAULT 0,
assignedServer VARCHAR(255),
claimedAt BIGINT,
startedAt BIGINT,
completedAt BIGINT,
lastUpdateAt BIGINT,
lastError TEXT,
retryCount INT NOT NULL DEFAULT 0,
claimableAt BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE KEY uk_rdf_partition_job_entity_idx (jobId, entityType, partitionIndex),
INDEX idx_rdf_partition_job (jobId),
INDEX idx_rdf_partition_status_priority (status, priority DESC),
INDEX idx_rdf_partition_claimable (jobId, status, claimableAt),
INDEX idx_rdf_partition_assigned_server (jobId, assignedServer),
CONSTRAINT fk_rdf_partition_job FOREIGN KEY (jobId) REFERENCES rdf_index_job(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS rdf_reindex_lock (
lockKey VARCHAR(64) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(255) NOT NULL,
acquiredAt BIGINT NOT NULL,
lastHeartbeat BIGINT NOT NULL,
expiresAt BIGINT NOT NULL,
PRIMARY KEY (lockKey)
);

CREATE TABLE IF NOT EXISTS rdf_index_server_stats (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(256) NOT NULL,
entityType VARCHAR(128) NOT NULL,
processedRecords BIGINT DEFAULT 0,
successRecords BIGINT DEFAULT 0,
failedRecords BIGINT DEFAULT 0,
partitionsCompleted INT DEFAULT 0,
partitionsFailed INT DEFAULT 0,
lastUpdatedAt BIGINT NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX idx_rdf_index_server_stats_job_server_entity (jobId, serverId, entityType),
INDEX idx_rdf_index_server_stats_job_id (jobId)
);
82 changes: 82 additions & 0 deletions bootstrap/sql/migrations/native/1.13.0/postgres/schemaChanges.sql
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,85 @@ FROM user_entity ue, role_entity re
WHERE ue.name = 'mcpapplicationbot'
AND re.name = 'ApplicationBotImpersonationRole'
ON CONFLICT DO NOTHING;

-- RDF distributed indexing state tables
CREATE TABLE IF NOT EXISTS rdf_index_job (
id VARCHAR(36) NOT NULL,
status VARCHAR(32) NOT NULL,
jobConfiguration JSONB NOT NULL,
totalRecords BIGINT NOT NULL DEFAULT 0,
processedRecords BIGINT NOT NULL DEFAULT 0,
successRecords BIGINT NOT NULL DEFAULT 0,
failedRecords BIGINT NOT NULL DEFAULT 0,
stats JSONB,
createdBy VARCHAR(256) NOT NULL,
createdAt BIGINT NOT NULL,
startedAt BIGINT,
completedAt BIGINT,
updatedAt BIGINT NOT NULL,
errorMessage TEXT,
PRIMARY KEY (id)
);

CREATE INDEX IF NOT EXISTS idx_rdf_index_job_status ON rdf_index_job(status);
CREATE INDEX IF NOT EXISTS idx_rdf_index_job_created ON rdf_index_job(createdAt DESC);

CREATE TABLE IF NOT EXISTS rdf_index_partition (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
entityType VARCHAR(128) NOT NULL,
partitionIndex INT NOT NULL,
rangeStart BIGINT NOT NULL,
rangeEnd BIGINT NOT NULL,
estimatedCount BIGINT NOT NULL,
workUnits BIGINT NOT NULL,
priority INT NOT NULL DEFAULT 50,
status VARCHAR(32) NOT NULL DEFAULT 'PENDING',
processingCursor BIGINT NOT NULL DEFAULT 0,
processedCount BIGINT NOT NULL DEFAULT 0,
successCount BIGINT NOT NULL DEFAULT 0,
failedCount BIGINT NOT NULL DEFAULT 0,
assignedServer VARCHAR(255),
claimedAt BIGINT,
startedAt BIGINT,
completedAt BIGINT,
lastUpdateAt BIGINT,
lastError TEXT,
retryCount INT NOT NULL DEFAULT 0,
claimableAt BIGINT NOT NULL DEFAULT 0,
PRIMARY KEY (id),
UNIQUE (jobId, entityType, partitionIndex),
CONSTRAINT fk_rdf_partition_job FOREIGN KEY (jobId) REFERENCES rdf_index_job(id) ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS idx_rdf_partition_job ON rdf_index_partition(jobId);
CREATE INDEX IF NOT EXISTS idx_rdf_partition_status_priority ON rdf_index_partition(status, priority DESC);
CREATE INDEX IF NOT EXISTS idx_rdf_partition_claimable ON rdf_index_partition(jobId, status, claimableAt);
CREATE INDEX IF NOT EXISTS idx_rdf_partition_assigned_server ON rdf_index_partition(jobId, assignedServer);

CREATE TABLE IF NOT EXISTS rdf_reindex_lock (
lockKey VARCHAR(64) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(255) NOT NULL,
acquiredAt BIGINT NOT NULL,
lastHeartbeat BIGINT NOT NULL,
expiresAt BIGINT NOT NULL,
PRIMARY KEY (lockKey)
);

CREATE TABLE IF NOT EXISTS rdf_index_server_stats (
id VARCHAR(36) NOT NULL,
jobId VARCHAR(36) NOT NULL,
serverId VARCHAR(256) NOT NULL,
entityType VARCHAR(128) NOT NULL,
processedRecords BIGINT DEFAULT 0,
successRecords BIGINT DEFAULT 0,
failedRecords BIGINT DEFAULT 0,
partitionsCompleted INT DEFAULT 0,
partitionsFailed INT DEFAULT 0,
lastUpdatedAt BIGINT NOT NULL,
PRIMARY KEY (id),
UNIQUE (jobId, serverId, entityType)
);

CREATE INDEX IF NOT EXISTS idx_rdf_index_server_stats_job_id ON rdf_index_server_stats(jobId);
Loading
Loading