Skip to content

Commit

Permalink
docs: add description for dsl object
Browse files Browse the repository at this point in the history
  • Loading branch information
jbl428 committed Feb 21, 2024
1 parent b4c8970 commit be449ce
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 7 deletions.
37 changes: 34 additions & 3 deletions docs/en/jpql-with-kotlin-jdsl/custom-dsl.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ You can use them to create your own functions.
You can also create your own `Model` that implements [`Expression`](expressions.md) or [`Predicate`](predicates.md) and create a function to return this Model.
You can implement [`JpqlSerializer`](custom-dsl.md#serializer) to let Kotlin JDSL to render `Model` to String.

{% hint style="info" %}
You need to implement `JpqlDsl.Constructor` as a companion object so that `jpql()` can recognize the DSL.
{% endhint %}
There are two ways to pass your own DSL to `jpql()`.
The first is to implement `JpqlDsl.Constructor` as a companion object to create a DSL object, and the second is to create a DSL instance.

### JpqlDsl.Constructor

With this way, you don't need to create an instance and a new instance is automatically created for each query creation.

```kotlin
class MyJpql : Jpql() {
Expand Down Expand Up @@ -39,6 +42,34 @@ val query = jpql(MyJpql) {
}
```

### Jpql Instance

With this way, you can reuse a single instance for query creation and utilize dependency injection.

```kotlin
class MyJpql(
private val encryptor: Encryptor,
) : Jpql() {
fun Path<String>.equalToEncrypted(value: String): Predicate {
val encrypted = encryptor.encrypt(value)
return this.eq(encrypted)
}
}

val encryptor = Encryptor()
val instance = MyJpql(encryptor)

val query = jpql(instance) {
select(
entity(Book::class)
).from(
entity(Book::class)
).where(
path(Book::title).equalToEncrypted("plain")
)
}
```

### Serializer

Implement `JpqlSerializer` and add it to `RenderContext` to render your own `Model` to String.
Expand Down
39 changes: 35 additions & 4 deletions docs/ko/jpql-with-kotlin-jdsl/custom-dsl.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
그리고 [`Expression`](expressions.md) 혹은 [`Predicate`](predicates.md)를 구현한 나만의 `Model` 클래스를 만들고, 이를 반환하는 함수를 만들 수 있습니다.
이 경우 [`JpqlSerializer`](custom-dsl.md#serializer)를 구현하여 `Model`을 String으로 랜더링하는 방법을 Kotlin JDSL에게 알려줄 수 있습니다.

{% hint style="info" %}
`jpql()`이 DSL을 인식하기 위해서 `JpqlDsl.Constructor`를 companion object로 구현해야 합니다.
{% endhint %}
이렇게 만들어진 나만의 DSL을 `jpql()`에 전달하기 위한 두 가지 방법이 있습니다.
첫 번째는 DSL 객체를 생성하는 `JpqlDsl.Constructor`를 companion object로 구현하는 것이고, 두 번째는 DSL 인스턴스를 생성하는 것입니다.

### JpqlDsl.Constructor

이 방법을 사용하면 클래스만 선언해 사용할 수 있으며 쿼리 생성 시마다 새로운 인스턴스를 자동으로 생성합니다.

```kotlin
class MyJpql : Jpql() {
Expand Down Expand Up @@ -39,9 +42,37 @@ val query = jpql(MyJpql) {
}
```

### Jpql Instance

이 방법을 사용하면 쿼리 생성에 하나의 인스턴스를 재활용할 수 있으며 의존성 주입을 활용할 수 있습니다.

```kotlin
class MyJpql(
private val encryptor: Encryptor,
) : Jpql() {
fun Path<String>.equalToEncrypted(value: String): Predicate {
val encrypted = encryptor.encrypt(value)
return this.eq(encrypted)
}
}

val encryptor = Encryptor()
val instance = MyJpql(encryptor)

val query = jpql(instance) {
select(
entity(Book::class)
).from(
entity(Book::class)
).where(
path(Book::title).equalToEncrypted("plain")
)
}
```

### Serializer

나만의 `Model`String을 랜더링하기 위해 `JpqlSerializer`를 구현하고 이를 `RenderContext`에 추가해야 합니다.
나만의 `Model`String으로 랜더링하기 위해 `JpqlSerializer`를 구현하고 이를 `RenderContext`에 추가해야 합니다.

`JpqlSerializer`는 랜더링 로직을 구현할 수 있도록 `JpqlWriter``RenderContext`를 제공합니다.
`RenderContext`를 통해 `JpqlRenderSerializer`를 얻어 나의 `Model`이 가지고 있는 다른 `Model`을 랜더링할 수 있습니다.
Expand Down

0 comments on commit be449ce

Please sign in to comment.