Skip to content

Commit e85b966

Browse files
feat: hint from comment (#141)
1 parent 5369c54 commit e85b966

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.mapping.Constraint;
1313
import org.hibernate.mapping.ForeignKey;
1414
import org.hibernate.mapping.Index;
15+
import org.hibernate.query.spi.QueryOptions;
1516
import org.hibernate.service.ServiceRegistry;
1617
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
1718
import org.hibernate.sql.ast.spi.SqlAppender;
@@ -121,8 +122,20 @@ public void initializeFunctionRegistry(FunctionContributions functionContributio
121122
}
122123

123124
@Override
124-
public String getQueryHintString(String query, List<String> hintList) {
125-
return IndexQueryHintHandler.INSTANCE.addQueryHints(query, hintList);
125+
public String addSqlHintOrComment(String sql, QueryOptions queryOptions, boolean commentsEnabled) {
126+
if (queryOptions.getDatabaseHints() != null) {
127+
sql = IndexQueryHintHandler.addQueryHints(sql, queryOptions.getDatabaseHints());
128+
}
129+
130+
if (queryOptions.getComment() != null && IndexQueryHintHandler.commentIsHint(queryOptions.getComment())) {
131+
return IndexQueryHintHandler.addQueryHints(sql, List.of(queryOptions.getComment()));
132+
}
133+
134+
if (commentsEnabled && queryOptions.getComment() != null) {
135+
sql = prependComment(sql, queryOptions.getComment());
136+
}
137+
138+
return sql;
126139
}
127140

128141
@Override

hibernate-dialect/src/main/java/tech/ydb/hibernate/dialect/hint/IndexQueryHintHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ public class IndexQueryHintHandler {
1313
.compile("^\\s*(select.+?from\\s+\\w+)(.+where.+)$", Pattern.CASE_INSENSITIVE);
1414

1515
public static final String HINT_USE_INDEX = "use_index:";
16-
public static final IndexQueryHintHandler INSTANCE = new IndexQueryHintHandler();
1716

18-
public String addQueryHints(String query, List<String> hints) {
17+
public static boolean commentIsHint(String comment) {
18+
return comment.startsWith(HINT_USE_INDEX);
19+
}
20+
21+
public static String addQueryHints(String query, List<String> hints) {
1922
if (hints.isEmpty()) {
2023
return query;
2124
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44
import org.hibernate.cfg.AvailableSettings;
55
import org.hibernate.cfg.Configuration;
6+
import org.hibernate.jpa.HibernateHints;
67
import org.hibernate.query.Query;
78
import static org.junit.jupiter.api.Assertions.assertEquals;
89
import org.junit.jupiter.api.BeforeAll;
@@ -165,7 +166,18 @@ void groupByGroupName_ViewIndex() {
165166
session -> {
166167
Group group = session
167168
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
168-
.addQueryHint("use_index:group_name_index")
169+
.addQueryHint("use_index:group_name_index") // Hibernate
170+
.getSingleResult();
171+
172+
assertEquals("M3439", group.getName());
173+
}
174+
);
175+
176+
inTransaction(
177+
session -> {
178+
Group group = session
179+
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
180+
.setHint(HibernateHints.HINT_COMMENT, "use_index:group_name_index") // JPA
169181
.getSingleResult();
170182

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

0 commit comments

Comments
 (0)