Skip to content

Add Ydb repository interfaces; support Ydb specific types; enhance and add new tests #133

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 8 commits into from
Jun 3, 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
4 changes: 2 additions & 2 deletions spring-data-dialect/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

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

<name>Spring Data YDB Dialect</name>
<description>Support Spring Data JDBC YDB (YQL) Dialect</description>
Expand Down Expand Up @@ -62,7 +62,6 @@
<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>
Expand Down Expand Up @@ -103,6 +102,7 @@
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package tech.ydb.data.core.convert;

import java.sql.SQLType;

import tech.ydb.jdbc.YdbConst;
import tech.ydb.table.values.PrimitiveType;

/**
* @author Madiyar Nurgazin
*/
public record YQLType(PrimitiveType type) implements SQLType {
@Override
public String getName() {
return type.name();
}

@Override
public String getVendor() {
return "YDB";
}

@Override
public Integer getVendorTypeNumber() {
return YdbConst.SQL_KIND_PRIMITIVE + type.ordinal();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
import org.springframework.data.util.TypeInformation;
import org.springframework.lang.Nullable;
import tech.ydb.data.support.YdbJdbcUtil;
import tech.ydb.data.repository.support.YdbJdbcUtil;

/**
* @author Madiyar Nurgazin
Expand All @@ -24,6 +24,9 @@ public YdbMappingJdbcConverter(RelationalMappingContext context, RelationResolve

@Override
public SQLType getTargetSqlType(RelationalPersistentProperty property) {
if (property.isAnnotationPresent(YdbType.class)) {
return new YQLType(property.getRequiredAnnotation(YdbType.class).value());
}
return YdbJdbcUtil.targetSqlTypeFor(getColumnType(property));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package tech.ydb.data.core.convert;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import tech.ydb.table.values.PrimitiveType;

/**
* @author Madiyar Nurgazin
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface YdbType {
PrimitiveType value();
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
* @author Madiyar Nurgazin
*/
public class YdbDialect extends AbstractDialect {

public static final YdbDialect INSTANCE = new YdbDialect();

private static final LimitClause LIMIT_CLAUSE = new LimitClause() {
Expand Down Expand Up @@ -43,7 +42,7 @@ public Position getClausePosition() {

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

public LockClause.Position getClausePosition() {
Expand Down Expand Up @@ -85,5 +84,4 @@ public InsertRenderContext getInsertRenderContext() {
public OrderByNullPrecedence orderByNullHandling() {
return OrderByNullPrecedence.NONE;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package tech.ydb.data.repository;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

/**
* @author Madiyar Nurgazin
*/
@NoRepositoryBean
public interface YdbCrudRepository<T, ID> extends YdbRepository<T, ID>, CrudRepository<T, ID> {
<S extends T> Iterable<S> insertAll(Iterable<S> entities);

<S extends T> Iterable<S> updateAll(Iterable<S> entities);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package tech.ydb.data.repository;

import java.util.List;

import org.springframework.data.repository.ListCrudRepository;
import org.springframework.data.repository.NoRepositoryBean;

/**
* @author Madiyar Nurgazin
*/
@NoRepositoryBean
public interface YdbListCrudRepository<T, ID> extends YdbRepository<T, ID>, ListCrudRepository<T, ID> {
<S extends T> List<S> insertAll(Iterable<S> entities);

<S extends T> List<S> updateAll(Iterable<S> entities);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package tech.ydb.data.repository;

import org.springframework.data.repository.ListPagingAndSortingRepository;
import org.springframework.data.repository.NoRepositoryBean;

/**
* @author Madiyar Nurgazin
*/
@NoRepositoryBean
public interface YdbListPagingAndSortingRepository<T, ID> extends YdbRepository<T, ID>,
ListPagingAndSortingRepository<T, ID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package tech.ydb.data.repository;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;

/**
* @author Madiyar Nurgazin
*/
@NoRepositoryBean
public interface YdbPagingAndSortingRepository<T, ID> extends YdbRepository<T, ID>, PagingAndSortingRepository<T, ID> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package tech.ydb.data.repository;

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

/**
* @author Madiyar Nurgazin
*/
@NoRepositoryBean
public interface YdbRepository<T, ID> extends Repository<T, ID> {
<S extends T> S insert(S entity);

<S extends T> S update(S entity);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package tech.ydb.data.config;
package tech.ydb.data.repository.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package tech.ydb.data.repository.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.data.jdbc.repository.config.EnableJdbcRepositories;
import tech.ydb.data.repository.support.SimpleYdbJdbcRepository;

/**
* @author Madiyar Nurgazin
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@EnableJdbcRepositories(repositoryBaseClass = SimpleYdbJdbcRepository.class)
public @interface EnableYdbRepositories {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package tech.ydb.data.config;
package tech.ydb.data.repository.config;

import java.sql.Connection;
import java.sql.SQLException;
Expand All @@ -16,11 +16,11 @@
* @author Madiyar Nurgazin
*/
public class YdbDialectProvider extends DialectResolver.DefaultDialectProvider {

@Override
public Optional<Dialect> getDialect(JdbcOperations operations) {
Optional<Dialect> ydbDialect = Optional.ofNullable(
operations.execute((ConnectionCallback<Dialect>) YdbDialectProvider::getDialect));
operations.execute((ConnectionCallback<Dialect>) YdbDialectProvider::getDialect)
);

if (ydbDialect.isPresent()) {
return ydbDialect;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package tech.ydb.data.repository.support;

import org.springframework.data.jdbc.core.JdbcAggregateOperations;
import org.springframework.data.jdbc.core.convert.JdbcConverter;
import org.springframework.data.jdbc.repository.support.SimpleJdbcRepository;
import org.springframework.data.mapping.PersistentEntity;
import org.springframework.transaction.annotation.Transactional;
import tech.ydb.data.repository.YdbCrudRepository;
import tech.ydb.data.repository.YdbPagingAndSortingRepository;

/**
* @author Madiyar Nurgazin
*/
@Transactional(readOnly = true)
public class SimpleYdbJdbcRepository<T, ID> extends SimpleJdbcRepository<T, ID>
implements YdbCrudRepository<T, ID>, YdbPagingAndSortingRepository<T, ID> {
private final JdbcAggregateOperations entityOperations;

public SimpleYdbJdbcRepository(
JdbcAggregateOperations entityOperations, PersistentEntity<T, ?> entity, JdbcConverter converter
) {
super(entityOperations, entity, converter);
this.entityOperations = entityOperations;
}

@Transactional
@Override
public <S extends T> S insert(S entity) {
return entityOperations.insert(entity);
}

@Transactional
@Override
public <S extends T> S update(S entity) {
return entityOperations.update(entity);
}

@Transactional
@Override
public <S extends T> Iterable<S> insertAll(Iterable<S> entities) {
return entityOperations.insertAll(entities);
}

@Transactional
@Override
public <S extends T> Iterable<S> updateAll(Iterable<S> entities) {
return entityOperations.updateAll(entities);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package tech.ydb.data.support;
package tech.ydb.data.repository.support;

import java.sql.JDBCType;
import java.sql.SQLType;
Expand All @@ -15,12 +15,12 @@
* @author Madiyar Nurgazin
*/
public final class YdbJdbcUtil {
private static final Map<Class<?>, SQLType> sqlTypeMappings = new HashMap<>();
private static final Map<Class<?>, SQLType> sqlTypeByClass = new HashMap<>();

static {
sqlTypeMappings.put(LocalDateTime.class, JDBCType.TIME);
sqlTypeMappings.put(LocalDate.class, JDBCType.DATE);
sqlTypeMappings.put(Instant.class, JDBCType.TIMESTAMP);
sqlTypeByClass.put(LocalDateTime.class, JDBCType.TIME);
sqlTypeByClass.put(LocalDate.class, JDBCType.DATE);
sqlTypeByClass.put(Instant.class, JDBCType.TIMESTAMP);
}

private YdbJdbcUtil() {
Expand All @@ -30,10 +30,10 @@ private YdbJdbcUtil() {
public static SQLType targetSqlTypeFor(Class<?> type) {
Assert.notNull(type, "Type must not be null");

return sqlTypeMappings.keySet().stream() //
return sqlTypeByClass.keySet().stream() //
.filter(k -> k.isAssignableFrom(type)) //
.findFirst() //
.map(sqlTypeMappings::get) //
.map(sqlTypeByClass::get) //
.orElse(JdbcUtil.targetSqlTypeFor(type));
}
}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=tech.ydb.data.config.YdbDialectProvider
org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=tech.ydb.data.repository.config.YdbDialectProvider
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.transaction.annotation.Transactional;
import tech.ydb.test.junit5.YdbHelperExtension;

/**
* @author Madiyar Nurgazin
*/
@SpringBootTest(classes = YdbJdbcConfiguration.class)
@AutoConfigureDataJdbc
@Transactional
public abstract class YdbBaseTest {
@RegisterExtension
private static final YdbHelperExtension ydb = new YdbHelperExtension();
Expand Down
Loading