Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: CI

on:
push:
branches: [ master, main ]
pull_request:
branches: [ master, main ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4.4.1

- name: Check code formatting
run: ./gradlew spotlessCheck

- name: Build with generated files
run: ./gradlew clean generateAll build

- name: Run application
run: ./gradlew run

- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: build/test-results/test/

- name: Upload build reports
uses: actions/upload-artifact@v4
if: always()
with:
name: build-reports
path: build/reports/
57 changes: 49 additions & 8 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ application {
mainClass.set("com.example.Main")
}

var daoPackagePath = "src/main/java/com/example/dao"
var entityPackagePath = "src/main/java/com/example/entity"
var sqlFileDirPath = "src/main/resources/META-INF/com/example/dao"

tasks {
test {
useJUnitPlatform()
Expand All @@ -48,10 +52,6 @@ tasks {
dependsOn("generateDAOs", "generateEntities", "generateSqlFiles")
}

var daoPackagePath = "src/main/java/com/example/dao"
var entityPackagePath = "src/main/java/com/example/entity"
var sqlFileDirPath = "src/main/resources/META-INF/com/example/dao"

register("generateDAOs") {
dependsOn("generateEntities")
doLast {
Expand All @@ -61,6 +61,8 @@ tasks {
(1..generationSize).forEach { i ->
val employeeDaoFile = File(sourceDir, "Employee${i}Dao.java")
writeEmployeeDaoCode(employeeDaoFile, i)
val employeeAggregateStrategyFile = File(sourceDir, "Employee${i}AggregateStrategy.java")
writeEmployeeAggregateStrategyCode(employeeAggregateStrategyFile, i)
}
println("Generated DAO files in src/main/java/com/example/dao")
}
Expand All @@ -87,7 +89,15 @@ tasks {
dir.mkdirs()

val sqlFile = File(dir, "selectById.sql")
sqlFile.writeText("select /*%expand*/* from employee$i where id = /*id*/0\n")
sqlFile.writeText(
"""
SELECT /*%expand*/*
FROM employee$i e
INNER JOIN department$i d
ON e.department_id = d.id
WHERE e.id = /*id*/0
""".trimIndent(),
)
}
println("Generated SQL files in src/main/resources/META-INF/com/example/dao/EmployeeXxxDao")
}
Expand Down Expand Up @@ -125,13 +135,43 @@ fun writeEmployeeDaoCode(
@Delete
int delete(Employee$i entity);

@Select
@Select(aggregateStrategy = Employee${i}AggregateStrategy.class)
Employee$i selectById(Long id);
}
""".trimIndent(),
)
}

fun writeEmployeeAggregateStrategyCode(
file: File,
i: Int,
) {
file.writeText(
"""
package com.example.dao;

import org.seasar.doma.AggregateStrategy;
import org.seasar.doma.AssociationLinker;

import java.util.function.BiConsumer;

import com.example.entity.Department$i;
import com.example.entity.Employee$i;

@AggregateStrategy(root = Employee$i.class, tableAlias = "e")
public interface Employee${i}AggregateStrategy {

@AssociationLinker(propertyPath = "department", tableAlias = "d")
BiConsumer<Employee$i, Department$i> department =
(e, d) -> {
e.department = d;
d.employees.add(e);
};
}
""".trimIndent(),
)
}

fun writeEmployeeCode(
file: File,
i: Int,
Expand Down Expand Up @@ -191,6 +231,7 @@ fun writeDepartmentCode(
"""
package com.example.entity;

import java.util.ArrayList;
import java.util.List;

import org.seasar.doma.Association;
Expand All @@ -211,7 +252,7 @@ fun writeDepartmentCode(
@Version
public Integer version;
@Association
public List<Employee$i> employees;
public List<Employee$i> employees = new ArrayList<>();
}
""".trimIndent(),
)
Expand All @@ -221,7 +262,7 @@ spotless {
java {
googleJavaFormat(libs.versions.googleJavaFormat.get())
target("src/*/java/**/*.java")
targetExclude("**/generated/**")
targetExclude("**/generated/**", "$daoPackagePath/**", "$entityPackagePath/**", "$sqlFileDirPath/**")
}
kotlin {
target("*.gradle.kts")
Expand Down
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[versions]
junit = "5.10.0"
doma = "3.9.1-SNAPSHOT"
doma = "3.9.0"
h2 = "2.3.232"
slf4j = "2.0.17"
logback = "1.5.18"
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/com/example/Department.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example;

import com.example.domain.Name;
import java.util.ArrayList;
import java.util.List;
import org.seasar.doma.Association;
import org.seasar.doma.Entity;
Expand All @@ -18,5 +19,5 @@ public class Department {

public Name name;
@Version public Integer version;
@Association public List<Employee> employees;
@Association public List<Employee> employees = new ArrayList<>();
}
16 changes: 16 additions & 0 deletions src/main/java/com/example/EmployeeAggregateStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example;

import java.util.function.BiConsumer;
import org.seasar.doma.AggregateStrategy;
import org.seasar.doma.AssociationLinker;

@AggregateStrategy(root = Employee.class, tableAlias = "e")
public interface EmployeeAggregateStrategy {

@AssociationLinker(propertyPath = "department", tableAlias = "d")
BiConsumer<Employee, Department> department =
(e, d) -> {
e.department = d;
d.employees.add(e);
};
}
2 changes: 1 addition & 1 deletion src/main/java/com/example/EmployeeDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public interface EmployeeDao {
@Delete
int delete(Employee entity);

@Select
@Select(aggregateStrategy = EmployeeAggregateStrategy.class)
Employee selectById(Long id);

@Script
Expand Down
8 changes: 7 additions & 1 deletion src/main/java/com/example/Main.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example;

import java.util.Objects;
import org.seasar.doma.jdbc.Naming;
import org.seasar.doma.jdbc.SimpleConfig;
import org.seasar.doma.slf4j.Slf4jJdbcLogger;
Expand All @@ -16,10 +17,15 @@ public static void main(String[] args) {
.naming(Naming.SNAKE_LOWER_CASE)
.jdbcLogger(new Slf4jJdbcLogger())
.build();
var employeeDao = new EmployeeDaoImpl(config);
EmployeeDao employeeDao = new EmployeeDaoImpl(config);
employeeDao.create();
var employee = employeeDao.selectById(1L);

Objects.requireNonNull(employee);
Objects.requireNonNull(employee.name);
Objects.requireNonNull(employee.department);

logger.info(employee.name.value()); // John Smith
logger.info(employee.department.name.value()); // Engineering
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
select /*%expand*/* from employee where id = /*id*/0
SELECT /*%expand*/*
FROM employee e
INNER JOIN department d
ON e.department_id = d.id
WHERE e.id = /*id*/0
Loading