Skip to content

Spring-data-dialect initialization #78

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions spring-data-dialect/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# YDB Spring Data Dialect
91 changes: 91 additions & 0 deletions spring-data-dialect/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>tech.ydb.dialects</groupId>
<artifactId>spring-data-ydb-dialect</artifactId>
<version>0.9.0-SNAPSHOT</version>

<name>Spring Data YDB Dialect</name>
<description>Support Spring Data JDBC YDB (YQL) Dialect</description>
<url>https://github.com/ydb-platform/ydb-java-dialects</url>

<developers>
<developer>
<name>Madiyar Nurgazin</name>
<email>[email protected]</email>
<organization>YDB</organization>
<organizationUrl>https://ydb.tech/</organizationUrl>
</developer>
</developers>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.release>17</maven.compiler.release>

<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>

<springdata.jdbc.version>3.2.4</springdata.jdbc.version>
<ydb.jdbc.version>2.0.5</ydb.jdbc.version>
<junit5.version>5.10.2</junit5.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>tech.ydb</groupId>
<artifactId>ydb-sdk-bom</artifactId>
<version>2.1.9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jdbc</artifactId>
<version>${springdata.jdbc.version}</version>
</dependency>
<dependency>
<groupId>tech.ydb.jdbc</groupId>
<artifactId>ydb-jdbc-driver-shaded</artifactId>
<version>${ydb.jdbc.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tech.ydb.test</groupId>
<artifactId>ydb-junit5-support</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit5.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.2.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>3.2.3</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package tech.ydb.data.core.dialect;

import java.util.Collections;
import java.util.Set;

import org.springframework.data.relational.core.dialect.AbstractDialect;
import org.springframework.data.relational.core.dialect.InsertRenderContext;
import org.springframework.data.relational.core.dialect.LimitClause;
import org.springframework.data.relational.core.dialect.LockClause;
import org.springframework.data.relational.core.dialect.OrderByNullPrecedence;
import org.springframework.data.relational.core.sql.IdentifierProcessing;
import org.springframework.data.relational.core.sql.LockOptions;

/**
* @author Madiyar Nurgazin
*/
public class YdbDialect extends AbstractDialect {

public static final YdbDialect INSTANCE = new YdbDialect();

private static final LimitClause LIMIT_CLAUSE = new LimitClause() {

@Override
public String getLimit(long limit) {
return "LIMIT " + limit;
}

@Override
public String getOffset(long offset) {
return "OFFSET " + offset;
}

@Override
public String getLimitOffset(long limit, long offset) {
return String.format("LIMIT %s OFFSET %s", limit, offset);
}

@Override
public Position getClausePosition() {
return Position.AFTER_ORDER_BY;
}
};

private static final LockClause LOCK_CLAUSE = new LockClause() {
public String getLock(LockOptions lockOptions) {
throw new UnsupportedOperationException("YDB don't support FOR UPDATE statement");
}

public LockClause.Position getClausePosition() {
return null;
}
};

@Override
public LimitClause limit() {
return LIMIT_CLAUSE;
}

@Override
public LockClause lock() {
return LOCK_CLAUSE;
}

@Override
public IdentifierProcessing getIdentifierProcessing() {
return IdentifierProcessing.create(
new IdentifierProcessing.Quoting("`"),
IdentifierProcessing.LetterCasing.AS_IS
);
}

@Override
public Set<Class<?>> simpleTypes() {
return Collections.emptySet();
}

@Override
public InsertRenderContext getInsertRenderContext() {
return () -> {
throw new UnsupportedOperationException("YDB don't support VALUES (DEFAULT) statement");
};
}

@Override
public OrderByNullPrecedence orderByNullHandling() {
return OrderByNullPrecedence.NONE;
}

}