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
23 changes: 15 additions & 8 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@

name: Code Quality
permissions:
checks: write
pull-requests: write
contents: read

on:
push:
Expand All @@ -16,17 +21,19 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '25'
java-version: '21'
- name: Run Checkstyle
run: mvn --batch-mode checkstyle:check
- name: Install reviewdog
uses: reviewdog/action-setup@v1
with:
reviewdog_version: latest
- name: Annotate Checkstyle results in PR
if: github.event_name == 'pull_request'
uses: reviewdog/action-checkstyle@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-review
level: error
checkstyle_input: target/checkstyle-result.xml
run: |
reviewdog -f=checkstyle -name="checkstyle" -reporter=github-pr-review -level=error -fail-on-error < target/checkstyle-result.xml
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}

coverage:
runs-on: ubuntu-latest
Expand All @@ -37,7 +44,7 @@ jobs:
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '25'
java-version: '21'
- name: Build with coverage
run: mvn --batch-mode clean verify
- name: Upload JaCoCo coverage report
Expand Down
15 changes: 11 additions & 4 deletions .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
name: Unit Tests

permissions:
checks: write
pull-requests: write
contents: read

on:
push:
branches: [ "main", "master" ]
Expand All @@ -11,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ '25' ]
java-version: [ '21' ]
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand All @@ -28,15 +33,16 @@ jobs:
name: java-query-builder-jar
path: target/*.jar
- name: Publish JUnit test results
uses: actions/upload-test-results@v2
uses: EnricoMi/publish-unit-test-result-action@v2
if: (!cancelled())
with:
files: target/surefire-reports/*.xml

feature-tests:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ '25' ]
java-version: [ '21' ]
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand All @@ -48,6 +54,7 @@ jobs:
- name: Run feature tests
run: mvn --batch-mode -Dtest='feature.**.*Test' test
- name: Publish Feature Test Results
uses: actions/upload-test-results@v2
uses: EnricoMi/publish-unit-test-result-action@v2
if: (!cancelled())
with:
files: target/surefire-reports/*.xml
5 changes: 5 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ Run `mvn checkstyle:check` locally before pushing.
3. Handle it in `AbstractSqlDialect` (and dialect subclasses if behaviour differs)
4. Add tests for all three layers

## Adding Tests

- Add JUnit tests under `src/test/java/com/github/ezframework/javaquerybuilder/query/` and its subpackages.
- Focus on covering all core features, edge cases, and error handling.

## Releasing

Releases are published to **GitHub Packages** and available via **JitPack** automatically:
Expand Down
42 changes: 3 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
# JavaQueryBuilder

![CI](https://github.com/${{github.repository}}/actions/workflows/ci.yml/badge.svg)
![CI](https://github.com/EzFramework/JavaQueryBuilder/actions/workflows/ci.yml/badge.svg)

This project uses GitHub Actions for continuous integration. See `.github/workflows/ci.yml` for details.

A lightweight, fluent Java library for building SQL queries and filtering in-memory data — no runtime dependencies required.
A lightweight, fluent Java library for building SQL queries and filtering in-memory data, no runtime dependencies required.

## Features

Expand Down Expand Up @@ -154,40 +152,6 @@ SQLite wraps every table and column name in double quotes, which safely handles
`LIKE` values are automatically wrapped with `%` on both sides so `whereLike("name", "alice")` becomes `name LIKE ?` with parameter `%alice%`.



## Project Layout

```
src/main/java/com/skyblockexp/ezframework/query/
├── QueryBuilder.java Fluent builder — start here
├── Query.java Query data model; delegates rendering to SqlDialect
├── SqlResult.java Holds the generated SQL string and parameter list
├── SqlDialect.java Strategy interface (STANDARD / SQLITE constants)
├── AbstractSqlDialect.java Shared rendering logic — extend to add new dialects
├── StandardSqlDialect.java Standard SQL (no quoting)
├── SqliteDialect.java SQLite (double-quote identifiers, boolean → 0/1)
├── Condition.java Single field condition (operator + value)
├── Operator.java Enum of supported operators
└── QueryableStorage.java Interface for in-memory query execution
```

## License

MIT

## Test Coverage

This project uses [JaCoCo](https://www.jacoco.org/jacoco/) for test coverage analysis.

### How to Generate Coverage Report

1. Run all tests and generate the coverage report:
```sh
mvn test jacoco:report
```
2. Open the HTML report:
- Open `target/site/jacoco/index.html` in your browser to view detailed coverage metrics.

## Adding Tests
- Add JUnit tests under `src/test/java/com/github/ezframework/javaquerybuilder/query/` and its subpackages.
- Focus on covering all core features, edge cases, and error handling.
MIT
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
<url>https://github.com/EzFramework/JavaQueryBuilder</url>

<properties>
<maven.compiler.source>25</maven.compiler.source>
<maven.compiler.target>25</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Expand All @@ -40,8 +40,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>25</source>
<target>25</target>
<source>21</source>
<target>21</target>
</configuration>
</plugin>
<plugin>
Expand Down
33 changes: 17 additions & 16 deletions src/test/java/feature/query/QueryBuilderFeatureTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,23 @@ public class QueryBuilderFeatureTest {
@DisplayName("Builds a complex SELECT with multiple conditions and dialect")
void buildsComplexSelectWithDialect() {
SqlResult result = new QueryBuilder()
.select("id", "name", "email")
.from("users")
.whereEquals("status", "active")
.whereLike("email", "@example.com")
.whereGreaterThan("score", 100)
.orderBy("created_at", false)
.limit(5)
.offset(10)
.buildSql("users", SqlDialect.MYSQL);
assertTrue(result.getSql().contains("SELECT id, name, email FROM `users`"));
assertTrue(result.getSql().contains("status = ?"));
assertTrue(result.getSql().contains("email LIKE ?"));
assertTrue(result.getSql().contains("score > ?"));
assertTrue(result.getSql().contains("ORDER BY created_at DESC"));
assertTrue(result.getSql().contains("LIMIT 5"));
assertTrue(result.getSql().contains("OFFSET 10"));
.select("id", "name", "email")
.from("users")
.whereEquals("status", "active")
.whereLike("email", "@example.com")
.whereGreaterThan("score", 100)
.orderBy("created_at", false)
.limit(5)
.offset(10)
.buildSql("users", SqlDialect.MYSQL);
String sql = result.getSql();
assertTrue(sql.contains("SELECT `id`, `name`, `email` FROM `users`"), sql);
assertTrue(sql.contains("`status` = ?"), sql);
assertTrue(sql.contains("`email` LIKE ?"), sql);
assertTrue(sql.contains("`score` > ?"), sql);
assertTrue(sql.contains("ORDER BY `created_at` DESC"), sql);
assertTrue(sql.contains("LIMIT 5"), sql);
assertTrue(sql.contains("OFFSET 10"), sql);
assertEquals(List.of("active", "%@example.com%", 100), result.getParameters());
}

Expand Down
Loading