Skip to content

Commit 5369c54

Browse files
feat: view index on select from (#140)
1 parent cbbef49 commit 5369c54

File tree

6 files changed

+69
-4
lines changed

6 files changed

+69
-4
lines changed

.github/workflows/ci-hibernate-dialect.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020

2121
strategy:
2222
matrix:
23-
java: [ '17' ]
23+
java: [ '17', '21' ]
2424

2525
steps:
2626
- uses: actions/checkout@v4

hibernate-dialect/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.9.5 ##
2+
3+
- Added query hint for view index for "select * from ... where" queries
4+
15
## 0.9.4 ##
26

37
- Fixed the generated bool value

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

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package tech.ydb.hibernate.dialect;
22

33
import java.time.LocalDateTime;
4+
import java.util.List;
45
import org.hibernate.boot.model.FunctionContributions;
56
import org.hibernate.boot.model.TypeContributions;
67
import org.hibernate.dialect.Dialect;
@@ -51,6 +52,7 @@
5152
import org.hibernate.type.StandardBasicTypes;
5253
import tech.ydb.hibernate.dialect.exporter.EmptyExporter;
5354
import tech.ydb.hibernate.dialect.exporter.YdbIndexExporter;
55+
import tech.ydb.hibernate.dialect.hint.IndexQueryHintHandler;
5456
import tech.ydb.hibernate.dialect.translator.YdbSqlAstTranslatorFactory;
5557
import tech.ydb.hibernate.dialect.types.LocalDateTimeJavaType;
5658
import tech.ydb.hibernate.dialect.types.LocalDateTimeJdbcType;
@@ -118,6 +120,11 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
118120
);
119121
}
120122

123+
@Override
124+
public String getQueryHintString(String query, List<String> hintList) {
125+
return IndexQueryHintHandler.INSTANCE.addQueryHints(query, hintList);
126+
}
127+
121128
@Override
122129
public LimitHandler getLimitHandler() {
123130
return LimitOffsetLimitHandler.INSTANCE;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package tech.ydb.hibernate.dialect.hint;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.regex.Matcher;
6+
import java.util.regex.Pattern;
7+
8+
/**
9+
* @author Kirill Kurdyukov
10+
*/
11+
public class IndexQueryHintHandler {
12+
private static final Pattern SELECT_FROM_WHERE_QUERY_PATTERN = Pattern
13+
.compile("^\\s*(select.+?from\\s+\\w+)(.+where.+)$", Pattern.CASE_INSENSITIVE);
14+
15+
public static final String HINT_USE_INDEX = "use_index:";
16+
public static final IndexQueryHintHandler INSTANCE = new IndexQueryHintHandler();
17+
18+
public String addQueryHints(String query, List<String> hints) {
19+
if (hints.isEmpty()) {
20+
return query;
21+
}
22+
23+
var useIndexes = new ArrayList<String>();
24+
hints.forEach(hint -> {
25+
if (hint.startsWith(HINT_USE_INDEX)) {
26+
useIndexes.add(hint.substring(HINT_USE_INDEX.length()));
27+
}
28+
});
29+
30+
if (!useIndexes.isEmpty()) {
31+
Matcher matcher = SELECT_FROM_WHERE_QUERY_PATTERN.matcher(query);
32+
if (matcher.matches() && matcher.groupCount() > 1) {
33+
String startToken = matcher.group(1);
34+
String endToken = matcher.group(2);
35+
36+
return startToken + " view " + String.join(", ", useIndexes) + endToken;
37+
}
38+
}
39+
40+
return query;
41+
}
42+
}

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

+14-1
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("use_index: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

+1-2
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)