Skip to content

Commit dcb6446

Browse files
feat: hint pragma
1 parent 688c10c commit dcb6446

File tree

5 files changed

+56
-12
lines changed

5 files changed

+56
-12
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import tech.ydb.hibernate.dialect.exporter.EmptyExporter;
6565
import tech.ydb.hibernate.dialect.exporter.YdbIndexExporter;
6666
import tech.ydb.hibernate.dialect.hint.IndexQueryHintHandler;
67+
import tech.ydb.hibernate.dialect.hint.PragmaQueryHintHandler;
6768
import tech.ydb.hibernate.dialect.hint.QueryHintHandler;
6869
import tech.ydb.hibernate.dialect.hint.ScanQueryHintHandler;
6970
import tech.ydb.hibernate.dialect.translator.YdbSqlAstTranslatorFactory;
@@ -86,7 +87,8 @@ public class YdbDialect extends Dialect {
8687
private static final Exporter<Constraint> UNIQUE_KEY_EMPTY_EXPORTER = new EmptyExporter<>();
8788
private static final List<QueryHintHandler> QUERY_HINT_HANDLERS = List.of(
8889
IndexQueryHintHandler.INSTANCE,
89-
ScanQueryHintHandler.INSTANCE
90+
ScanQueryHintHandler.INSTANCE,
91+
PragmaQueryHintHandler.INSTANCE
9092
);
9193
private static final ConcurrentHashMap<Integer, DecimalJdbcType> DECIMAL_JDBC_TYPE_CACHE = new ConcurrentHashMap<>();
9294

@@ -203,7 +205,7 @@ public String addSqlHintOrComment(String sql, QueryOptions queryOptions, boolean
203205
if (queryOptions.getComment() != null) {
204206
boolean commentIsHint = false;
205207

206-
var hints = queryOptions.getComment().split(",");
208+
var hints = queryOptions.getComment().split(";");
207209

208210
for (var queryHintHandler : QUERY_HINT_HANDLERS) {
209211
for (var hint : hints) {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ public boolean commentIsHint(String comment) {
2626

2727
@Override
2828
public String addQueryHints(String query, List<String> hints) {
29-
if (hints.isEmpty()) {
30-
return query;
31-
}
32-
3329
var useIndexes = new ArrayList<String>();
3430
hints.forEach(hint -> {
3531
if (hint.startsWith(HINT_USE_INDEX)) {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package tech.ydb.hibernate.dialect.hint;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
/**
7+
* @author Kirill Kurdyukov
8+
*/
9+
public class PragmaQueryHintHandler implements QueryHintHandler {
10+
public static final PragmaQueryHintHandler INSTANCE = new PragmaQueryHintHandler();
11+
12+
private static final String HINT_PRAGMA = "pragma:";
13+
14+
@Override
15+
public String addQueryHints(String query, List<String> hints) {
16+
var yqlHints = hints.stream()
17+
.filter(hint -> hint.startsWith(HINT_PRAGMA))
18+
.map(hint -> "PRAGMA " + hint.substring(HINT_PRAGMA.length()) + ";\n")
19+
.collect(Collectors.joining());
20+
21+
return yqlHints + query;
22+
}
23+
24+
@Override
25+
public boolean commentIsHint(String comment) {
26+
return comment.startsWith(HINT_PRAGMA);
27+
}
28+
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ private ScanQueryHintHandler() {
1717

1818
@Override
1919
public String addQueryHints(String query, List<String> hints) {
20-
if (hints.isEmpty()) {
21-
return query;
22-
}
23-
2420
AtomicBoolean useScan = new AtomicBoolean(false);
2521
hints.forEach(hint -> {
2622
if (hint.equals(HINT_USE_SCAN)) {

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

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,24 @@ void studentsByGroupName_Eager_OneToManyTest() {
201201
);
202202
}
203203

204+
@Test
205+
void studentByGroupNameUsingPragmaHintTest() {
206+
inTransaction(
207+
session -> {
208+
List<Student> students = session
209+
.createQuery("FROM Group g JOIN FETCH g.students WHERE g.name = 'M3439'", Group.class)
210+
.addQueryHint("pragma:ydb.HashJoinMode='grace'")
211+
.addQueryHint("pragma:Warning(\"disable\", \"1101\")")
212+
.getSingleResult().getStudents();
213+
214+
assertEquals(2, students.size());
215+
216+
assertEquals("Петров П.П.", students.get(0).getName());
217+
assertEquals("Сидоров С.С.", students.get(1).getName());
218+
}
219+
);
220+
}
221+
204222
@Test
205223
void groupsByLecturerIdAndCourseId_Eager_ManyToManyTest() {
206224
inTransaction(
@@ -313,8 +331,9 @@ private static void checkCourses(List<Course> courses) {
313331
}
314332

315333
@Test
316-
void useIndexAndUseScanHintsTogetherTest() {
334+
void useAllHintsTogetherTest() {
317335
/*
336+
PRAGMA Warning("disable", "1101");
318337
scan select
319338
g1_0.GroupId,
320339
g1_0.GroupName
@@ -329,6 +348,7 @@ void useIndexAndUseScanHintsTogetherTest() {
329348
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
330349
.addQueryHint("use_index:group_name_index") // Hibernate
331350
.addQueryHint("use_scan")
351+
.addQueryHint("pragma:Warning(\"disable\", \"1101\")")
332352
.getSingleResult();
333353

334354
assertEquals("M3439", group.getName());
@@ -337,6 +357,7 @@ void useIndexAndUseScanHintsTogetherTest() {
337357

338358

339359
/*
360+
PRAGMA Warning("disable", "1101");
340361
scan select
341362
g1_0.GroupId,
342363
g1_0.GroupName
@@ -349,7 +370,8 @@ void useIndexAndUseScanHintsTogetherTest() {
349370
session -> {
350371
Group group = session
351372
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
352-
.setHint(HibernateHints.HINT_COMMENT, "use_index:group_name_index, use_scan") // JPA
373+
.setHint(HibernateHints.HINT_COMMENT,
374+
"use_index:group_name_index;use_scan;pragma:Warning(\"disable\", \"1101\")")
353375
.getSingleResult();
354376

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

0 commit comments

Comments
 (0)