Skip to content

Commit d60388b

Browse files
feat: view index on select from
1 parent cbbef49 commit d60388b

File tree

3 files changed

+31
-3
lines changed

3 files changed

+31
-3
lines changed

hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/YdbDialect.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package tech.ydb.hibernate.dialect;
22

33
import java.time.LocalDateTime;
4+
import java.util.regex.Matcher;
5+
import java.util.regex.Pattern;
46
import org.hibernate.boot.model.FunctionContributions;
57
import org.hibernate.boot.model.TypeContributions;
68
import org.hibernate.dialect.Dialect;
@@ -62,6 +64,7 @@ public class YdbDialect extends Dialect {
6264

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

6669
public YdbDialect(DialectResolutionInfo dialectResolutionInfo) {
6770
super(dialectResolutionInfo);
@@ -118,6 +121,19 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
118121
);
119122
}
120123

124+
@Override
125+
public String getQueryHintString(String query, String hints) {
126+
Matcher matcher = QUERY_PATTERN.matcher(query);
127+
if (matcher.matches() && matcher.groupCount() > 1) {
128+
String startToken = matcher.group(1);
129+
String endToken = matcher.group(2);
130+
131+
return startToken + " view " + hints + " " + endToken;
132+
} else {
133+
return query;
134+
}
135+
}
136+
121137
@Override
122138
public LimitHandler getLimitHandler() {
123139
return LimitOffsetLimitHandler.INSTANCE;

hibernate-dialect/src/test/java/tech/ydb/hibernate/student/StudentsRepositoryTest.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ void studentsAndCourses_Lazy_ManyToManyTest() {
143143
);
144144
}
145145

146-
147146
@Test
148147
void studentsByGroupName_Lazy_OneToManyTest() {
149148
inTransaction(
@@ -160,6 +159,20 @@ void studentsByGroupName_Lazy_OneToManyTest() {
160159
);
161160
}
162161

162+
@Test
163+
void groupByGroupName_ViewIndex() {
164+
inTransaction(
165+
session -> {
166+
Group group = session
167+
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
168+
.addQueryHint("group_name_index")
169+
.getSingleResult();
170+
171+
assertEquals("M3439", group.getName());
172+
}
173+
);
174+
}
175+
163176
@Test
164177
void studentsByGroupName_Eager_OneToManyTest() {
165178
inTransaction(

hibernate-dialect/src/test/java/tech/ydb/hibernate/student/entity/Group.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
import jakarta.persistence.NamedQuery;
88
import jakarta.persistence.OneToMany;
99
import jakarta.persistence.Table;
10+
import java.util.List;
1011
import lombok.Getter;
1112
import lombok.Setter;
1213

13-
import java.util.List;
14-
1514
/**
1615
* @author Kirill Kurdyukov
1716
*/

0 commit comments

Comments
 (0)