Skip to content

Commit ca8a013

Browse files
committed
chore: prepare CHANGELOG for v2.7.1 release
Add comprehensive changelog entry for v2.7.1 (2025-10-29) documenting: New features: - Window Functions Support (ROW_NUMBER, RANK, LAG, LEAD, etc.) - Common Table Expressions (CTEs) with recursive support - Set Operations (UNION, INTERSECT, EXCEPT) - DISTINCT and DISTINCT ON support - FILTER Clause for conditional aggregates (SQL:2003) - Comprehensive edge-case testing (20 new tests) Changed: - Aggregate helpers return FilterValue instead of RawValue - SelectQueryBuilder interface enhancements - QueryBuilder parameter management improvements Fixed: - MySQL recursive CTE string concatenation issue Technical details: - 574 tests, 2526 assertions (+41 tests, +129 assertions) - 108 examples passing (36 files × 3 dialects) - PHPStan Level 9 compliance - 6 new documentation files, 4 new example directories - 39 files changed, 6507 insertions(+), 80 deletions(-) Update version comparison links at bottom of file.
1 parent f5abe60 commit ca8a013

File tree

1 file changed

+108
-1
lines changed

1 file changed

+108
-1
lines changed

CHANGELOG.md

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,112 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
---
1111

12+
## [2.7.1] - 2025-10-29
13+
14+
### Added
15+
- **Window Functions Support** - Advanced analytics with SQL window functions:
16+
- **Ranking functions**: `Db::rowNumber()`, `Db::rank()`, `Db::denseRank()`, `Db::ntile()`
17+
- **Value access functions**: `Db::lag()`, `Db::lead()`, `Db::firstValue()`, `Db::lastValue()`, `Db::nthValue()`
18+
- **Window aggregates**: `Db::windowAggregate()` for running totals, moving averages
19+
- Support for `PARTITION BY`, `ORDER BY`, and frame clauses (`ROWS BETWEEN`)
20+
- Cross-database support (MySQL 8.0+, PostgreSQL 9.4+, SQLite 3.25+)
21+
- `WindowFunctionValue` class and `WindowHelpersTrait` with 11 helper methods
22+
- Complete implementation of `formatWindowFunction()` in all dialects
23+
- Comprehensive examples in `examples/16-window-functions/` (10 use cases)
24+
- Full documentation:
25+
- `documentation/03-query-builder/window-functions.md` (500+ lines)
26+
- `documentation/07-helper-functions/window-helpers.md` (400+ lines)
27+
- 8 comprehensive tests with 44 assertions covering all window functions
28+
- Use cases: rankings, leaderboards, period-over-period analysis, trends, quartiles
29+
30+
- **Common Table Expressions (CTEs) Support** - WITH clauses for complex queries:
31+
- `QueryBuilder::with()` and `withRecursive()` methods for CTE definitions
32+
- Support for basic CTEs using `Closure`, `QueryBuilder`, or raw SQL
33+
- Recursive CTEs for hierarchical data processing (tree structures, organizational charts)
34+
- Multiple CTEs with unique parameter scoping to avoid conflicts
35+
- Explicit column lists for CTEs (recommended for recursive CTEs)
36+
- Proper parameter passing from CTEs to main query
37+
- Cross-database support (MySQL 8.0+, PostgreSQL 8.4+, SQLite 3.8.3+)
38+
- `CteManager` and `CteDefinition` classes for CTE management
39+
- Comprehensive test coverage (9 new tests in `SharedCoverageTest`)
40+
- 2 runnable examples in `examples/17-cte/` (basic and recursive CTEs, 10 scenarios total)
41+
- Complete documentation in `documentation/03-query-builder/cte.md` with use cases and best practices
42+
43+
- **Set Operations** - UNION, INTERSECT, and EXCEPT support:
44+
- `QueryBuilder::union()`, `unionAll()`, `intersect()`, `except()` methods
45+
- Support for both `Closure` and `QueryBuilder` instances in set operations
46+
- Proper `ORDER BY`/`LIMIT`/`OFFSET` placement after set operations (SQL standard compliance)
47+
- Cross-database: MySQL 8.0+, PostgreSQL, SQLite 3.8.3+
48+
- `UnionQuery` class for operation management
49+
- 6 comprehensive examples in `examples/18-set-operations/`
50+
- Complete documentation in `documentation/03-query-builder/set-operations.md`
51+
52+
- **DISTINCT and DISTINCT ON** - Remove duplicates from result sets:
53+
- `QueryBuilder::distinct()` method for all databases
54+
- `QueryBuilder::distinctOn()` method with PostgreSQL-only support
55+
- Runtime dialect validation with `RuntimeException` for unsupported databases
56+
- `DialectInterface::supportsDistinctOn()` method for feature detection
57+
- Examples added to `examples/01-basic/05-ordering.php`
58+
- Complete documentation in `documentation/03-query-builder/distinct.md`
59+
60+
- **FILTER Clause for Conditional Aggregates** - SQL:2003 standard compliance:
61+
- `filter()` method chainable after all aggregate functions (`COUNT`, `SUM`, `AVG`, `MIN`, `MAX`)
62+
- `FilterValue` class replaces `RawValue` for aggregate function returns
63+
- Native `FILTER (WHERE ...)` clause for PostgreSQL and SQLite 3.30+
64+
- Automatic `CASE WHEN` fallback for MySQL (which doesn't support FILTER clause)
65+
- `DialectInterface::supportsFilterClause()` method for feature detection
66+
- Examples added to `examples/02-intermediate/02-aggregations.php`
67+
- Complete documentation in `documentation/03-query-builder/filter-clause.md`
68+
- SQL:2003 standard compliance with automatic dialect-specific translation
69+
70+
- **Comprehensive Edge-Case Testing** - 20 new edge-case tests covering critical scenarios:
71+
- **CTEs**: Empty results, NULL values, recursive CTEs with complex data
72+
- **UNION/INTERSECT/EXCEPT**: Empty tables, NULL handling, no common values
73+
- **FILTER Clause**: No matches, all NULLs, empty tables
74+
- **DISTINCT**: Empty tables, all NULLs, mixed NULL/non-NULL values
75+
- **Window Functions**: Empty tables, NULL partitions, single row scenarios
76+
- Added 18 new tests in `SharedCoverageTest`
77+
- Added 2 dialect-specific tests (MySQL, SQLite) for DISTINCT ON validation
78+
- Edge cases validate: empty result sets, NULL value handling, boundary conditions, unsupported feature detection
79+
80+
### Changed
81+
- **Aggregate helpers return type**: All aggregate functions (`Db::count()`, `Db::sum()`, `Db::avg()`, `Db::min()`, `Db::max()`) now return `FilterValue` instead of `RawValue` to support chaining with `filter()` method
82+
- **SelectQueryBuilder enhancements**: Added methods `setUnions()`, `setDistinct()`, `setDistinctOn()` to `SelectQueryBuilderInterface`
83+
- **QueryBuilder parameter management**: Enhanced parameter merging for UNION subqueries to prevent conflicts
84+
85+
### Fixed
86+
- **MySQL recursive CTE string concatenation**: Fixed `examples/17-cte/02-recursive-cte.php` test failure on MySQL
87+
- MySQL doesn't support `||` operator for string concatenation by default
88+
- Added dialect-specific handling using `CONCAT()` function for MySQL
89+
- PostgreSQL and SQLite continue using `||` operator
90+
- Example now works correctly on all three database dialects
91+
92+
### Technical Details
93+
- **All tests passing**: 574 tests, 2526 assertions (+41 tests, +129 assertions from 2.7.0)
94+
- **All examples passing**: 108/108 examples (36 files × 3 dialects each)
95+
- SQLite: 36/36 ✅
96+
- MySQL: 36/36 ✅
97+
- PostgreSQL: 36/36 ✅
98+
- **PHPStan Level 9**: Zero errors across entire codebase (upgraded from Level 8)
99+
- **PHP-CS-Fixer**: All code complies with PSR-12 standards
100+
- **Full backward compatibility**: 100% maintained - all existing code continues to work
101+
- **Code quality**: Follows KISS, SOLID, DRY, YAGNI principles
102+
- **Documentation**: Added 6 new comprehensive documentation files:
103+
- `documentation/03-query-builder/window-functions.md` (473 lines)
104+
- `documentation/07-helper-functions/window-helpers.md` (550 lines)
105+
- `documentation/03-query-builder/cte.md` (409 lines)
106+
- `documentation/03-query-builder/set-operations.md` (204 lines)
107+
- `documentation/03-query-builder/distinct.md` (320 lines)
108+
- `documentation/03-query-builder/filter-clause.md` (349 lines)
109+
- **Examples**: Added 4 new example directories with comprehensive demos:
110+
- `examples/16-window-functions/` (360 lines, 10 use cases)
111+
- `examples/17-cte/` (521 lines total, 10 scenarios)
112+
- `examples/18-set-operations/` (138 lines, 6 set operation examples)
113+
- Extended existing examples with DISTINCT and FILTER clause demonstrations
114+
- **Code statistics**: 39 files changed, 6507 insertions(+), 80 deletions(-)
115+
116+
---
117+
12118
## [2.7.0] - 2025-10-28
13119

14120
### Added
@@ -713,7 +819,8 @@ Initial tagged release with basic PDO database abstraction functionality.
713819

714820
---
715821

716-
[Unreleased]: https://github.com/tommyknocker/pdo-database-class/compare/v2.7.0...HEAD
822+
[Unreleased]: https://github.com/tommyknocker/pdo-database-class/compare/v2.7.1...HEAD
823+
[2.7.1]: https://github.com/tommyknocker/pdo-database-class/compare/v2.7.0...v2.7.1
717824
[2.7.0]: https://github.com/tommyknocker/pdo-database-class/compare/v2.6.2...v2.7.0
718825
[2.6.2]: https://github.com/tommyknocker/pdo-database-class/compare/v2.6.1...v2.6.2
719826
[2.6.1]: https://github.com/tommyknocker/pdo-database-class/compare/v2.6.0...v2.6.1

0 commit comments

Comments
 (0)