Skip to content

Commit 9a27eca

Browse files
feat: use_index hint
1 parent 49178e1 commit 9a27eca

File tree

3 files changed

+48
-15
lines changed

3 files changed

+48
-15
lines changed

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

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

33
import java.time.LocalDateTime;
4-
import java.util.regex.Matcher;
5-
import java.util.regex.Pattern;
4+
import java.util.List;
65
import org.hibernate.boot.model.FunctionContributions;
76
import org.hibernate.boot.model.TypeContributions;
87
import org.hibernate.dialect.Dialect;
@@ -53,6 +52,7 @@
5352
import org.hibernate.type.StandardBasicTypes;
5453
import tech.ydb.hibernate.dialect.exporter.EmptyExporter;
5554
import tech.ydb.hibernate.dialect.exporter.YdbIndexExporter;
55+
import tech.ydb.hibernate.dialect.hint.IndexQueryHintHandler;
5656
import tech.ydb.hibernate.dialect.translator.YdbSqlAstTranslatorFactory;
5757
import tech.ydb.hibernate.dialect.types.LocalDateTimeJavaType;
5858
import tech.ydb.hibernate.dialect.types.LocalDateTimeJdbcType;
@@ -64,8 +64,6 @@ public class YdbDialect extends Dialect {
6464

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

7068
public YdbDialect(DialectResolutionInfo dialectResolutionInfo) {
7169
super(dialectResolutionInfo);
@@ -123,16 +121,8 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
123121
}
124122

125123
@Override
126-
public String getQueryHintString(String query, String hints) {
127-
Matcher matcher = SELECT_FROM_WHERE_QUERY_PATTERN.matcher(query);
128-
if (matcher.matches() && matcher.groupCount() > 1) {
129-
String startToken = matcher.group(1);
130-
String endToken = matcher.group(2);
131-
132-
return startToken + " view " + hints + " " + endToken;
133-
} else {
134-
return query;
135-
}
124+
public String getQueryHintString(String query, List<String> hintList) {
125+
return IndexQueryHintHandler.INSTANCE.addQueryHints(query, hintList);
136126
}
137127

138128
@Override
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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+
var hintSplit = hint.split(":");
26+
if (hintSplit.length == 2 && hintSplit[0].equals(HINT_USE_INDEX)) {
27+
useIndexes.add(hintSplit[1]);
28+
}
29+
});
30+
31+
if (!useIndexes.isEmpty()) {
32+
Matcher matcher = SELECT_FROM_WHERE_QUERY_PATTERN.matcher(query);
33+
if (matcher.matches() && matcher.groupCount() > 1) {
34+
String startToken = matcher.group(1);
35+
String endToken = matcher.group(2);
36+
37+
return startToken + " view " + String.join(", ", useIndexes) + endToken;
38+
}
39+
}
40+
41+
return query;
42+
}
43+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ void groupByGroupName_ViewIndex() {
165165
session -> {
166166
Group group = session
167167
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
168-
.addQueryHint("group_name_index")
168+
.addQueryHint("use_index:group_name_index")
169169
.getSingleResult();
170170

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

0 commit comments

Comments
 (0)