Skip to content

Commit 809ec33

Browse files
feat: hint pragma (#169)
1 parent d6ce147 commit 809ec33

File tree

7 files changed

+76
-13
lines changed

7 files changed

+76
-13
lines changed

hibernate-dialect/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.4.0 ##
2+
3+
- Added hint for YQL pragma queries
4+
15
## 1.3.0 ##
26

37
- Added support UUID YDB type

hibernate-dialect/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>tech.ydb.dialects</groupId>
88
<artifactId>hibernate-ydb-dialect</artifactId>
9-
<version>1.3.0</version>
9+
<version>1.4.0</version>
1010

1111
<packaging>jar</packaging>
1212

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

+4-2
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

-4
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)) {
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 = "add_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

-4
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

+39-2
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,39 @@ void studentsByGroupName_Eager_OneToManyTest() {
201201
);
202202
}
203203

204+
@Test
205+
void studentByGroupNameUsingPragmaHintTest() {
206+
inTransaction(
207+
session -> {
208+
/*
209+
PRAGMA ydb.HashJoinMode='grace'; PRAGMA Warning("disable", "1101"); select
210+
g1_0.GroupId,
211+
g1_0.GroupName,
212+
s1_0.GroupId,
213+
s1_0.StudentId,
214+
s1_0.StudentName
215+
from
216+
Groups g1_0
217+
join
218+
Students s1_0
219+
on g1_0.GroupId=s1_0.GroupId
220+
where
221+
g1_0.GroupName='M3439'
222+
*/
223+
List<Student> students = session
224+
.createQuery("FROM Group g JOIN FETCH g.students WHERE g.name = 'M3439'", Group.class)
225+
.addQueryHint("add_pragma:ydb.HashJoinMode='grace'")
226+
.addQueryHint("add_pragma:Warning(\"disable\", \"1101\")")
227+
.getSingleResult().getStudents();
228+
229+
assertEquals(2, students.size());
230+
231+
assertEquals("Петров П.П.", students.get(0).getName());
232+
assertEquals("Сидоров С.С.", students.get(1).getName());
233+
}
234+
);
235+
}
236+
204237
@Test
205238
void groupsByLecturerIdAndCourseId_Eager_ManyToManyTest() {
206239
inTransaction(
@@ -313,8 +346,9 @@ private static void checkCourses(List<Course> courses) {
313346
}
314347

315348
@Test
316-
void useIndexAndUseScanHintsTogetherTest() {
349+
void useAllHintsTogetherTest() {
317350
/*
351+
PRAGMA Warning("disable", "1101");
318352
scan select
319353
g1_0.GroupId,
320354
g1_0.GroupName
@@ -329,6 +363,7 @@ void useIndexAndUseScanHintsTogetherTest() {
329363
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
330364
.addQueryHint("use_index:group_name_index") // Hibernate
331365
.addQueryHint("use_scan")
366+
.addQueryHint("add_pragma:Warning(\"disable\", \"1101\")")
332367
.getSingleResult();
333368

334369
assertEquals("M3439", group.getName());
@@ -337,6 +372,7 @@ void useIndexAndUseScanHintsTogetherTest() {
337372

338373

339374
/*
375+
PRAGMA Warning("disable", "1101");
340376
scan select
341377
g1_0.GroupId,
342378
g1_0.GroupName
@@ -349,7 +385,8 @@ void useIndexAndUseScanHintsTogetherTest() {
349385
session -> {
350386
Group group = session
351387
.createQuery("FROM Group g WHERE g.name = 'M3439'", Group.class)
352-
.setHint(HibernateHints.HINT_COMMENT, "use_index:group_name_index, use_scan") // JPA
388+
.setHint(HibernateHints.HINT_COMMENT,
389+
"use_index:group_name_index;use_scan;add_pragma:Warning(\"disable\", \"1101\")")
353390
.getSingleResult();
354391

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

0 commit comments

Comments
 (0)