Skip to content

Commit

Permalink
feat: view index on select from
Browse files Browse the repository at this point in the history
  • Loading branch information
KirillKurdyukov committed Aug 19, 2024
1 parent cbbef49 commit d60388b
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package tech.ydb.hibernate.dialect;

import java.time.LocalDateTime;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.hibernate.boot.model.FunctionContributions;
import org.hibernate.boot.model.TypeContributions;
import org.hibernate.dialect.Dialect;
Expand Down Expand Up @@ -62,6 +64,7 @@ public class YdbDialect extends Dialect {

private static final Exporter<ForeignKey> FOREIGN_KEY_EMPTY_EXPORTER = new EmptyExporter<>();
private static final Exporter<Constraint> UNIQUE_KEY_EMPTY_EXPORTER = new EmptyExporter<>();
private static final Pattern QUERY_PATTERN = Pattern.compile("^\\s*(select.+?from\\s+\\w+)(.+where.+)$", Pattern.CASE_INSENSITIVE);

public YdbDialect(DialectResolutionInfo dialectResolutionInfo) {
super(dialectResolutionInfo);
Expand Down Expand Up @@ -118,6 +121,19 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
);
}

@Override
public String getQueryHintString(String query, String hints) {
Matcher matcher = QUERY_PATTERN.matcher(query);
if (matcher.matches() && matcher.groupCount() > 1) {
String startToken = matcher.group(1);
String endToken = matcher.group(2);

return startToken + " view " + hints + " " + endToken;
} else {
return query;
}
}

@Override
public LimitHandler getLimitHandler() {
return LimitOffsetLimitHandler.INSTANCE;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ void studentsAndCourses_Lazy_ManyToManyTest() {
);
}


@Test
void studentsByGroupName_Lazy_OneToManyTest() {
inTransaction(
Expand All @@ -160,6 +159,20 @@ void studentsByGroupName_Lazy_OneToManyTest() {
);
}

@Test
void groupByGroupName_ViewIndex() {
inTransaction(
session -> {
Group group = session
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
.addQueryHint("group_name_index")
.getSingleResult();

assertEquals("M3439", group.getName());
}
);
}

@Test
void studentsByGroupName_Eager_OneToManyTest() {
inTransaction(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@
import jakarta.persistence.NamedQuery;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.util.List;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

/**
* @author Kirill Kurdyukov
*/
Expand Down

0 comments on commit d60388b

Please sign in to comment.