docs: Add CLAUDE.md with codebase guidance

Create comprehensive documentation for future Claude Code instances working in this repository, including:
- Development commands for testing, building, and code quality
- Core architecture overview of the SQL query builder system
- Directory structure and component explanations
- Testing patterns and conventions
- Key dependencies and their purposes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-09-27 15:47:28 +08:00
co-authored by Claude
parent 764eccfafd
commit 304d553b3c
113 changed files with 914 additions and 432 deletions
+45 -45
View File
@@ -3,11 +3,11 @@ package db_test
import (
"testing"
dbv2 "git.fsdpf.net/go/db/v2"
"git.fsdpf.net/go/db/v2/exp"
"git.fsdpf.net/go/db/v2/internal/errors"
"git.fsdpf.net/go/db/v2/internal/sb"
"git.fsdpf.net/go/db/v2/mocks"
dbv2 "git.fsdpf.net/go/db"
"git.fsdpf.net/go/db/exp"
"git.fsdpf.net/go/db/internal/errors"
"git.fsdpf.net/go/db/internal/sb"
"git.fsdpf.net/go/db/mocks"
"github.com/DATA-DOG/go-sqlmock"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/suite"
@@ -100,7 +100,7 @@ func (dds *deleteDatasetSuite) TestPrepared() {
func (dds *deleteDatasetSuite) TestGetClauses() {
ds := dbv2.Delete("test")
ce := exp.NewDeleteClauses().SetFrom(dbv2.I("test"))
ce := exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test"))
dds.Equal(ce, ds.GetClauses())
}
@@ -110,12 +110,12 @@ func (dds *deleteDatasetSuite) TestWith() {
dds.assertCases(
deleteTestCase{
ds: bd.With("test-cte", from),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")).
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")).
CommonTablesAppend(exp.NewCommonTableExpression(false, "test-cte", from)),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
}
@@ -126,12 +126,12 @@ func (dds *deleteDatasetSuite) TestWithRecursive() {
dds.assertCases(
deleteTestCase{
ds: bd.WithRecursive("test-cte", from),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")).
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")).
CommonTablesAppend(exp.NewCommonTableExpression(true, "test-cte", from)),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
}
@@ -141,23 +141,23 @@ func (dds *deleteDatasetSuite) TestFrom_withIdentifier() {
dds.assertCases(
deleteTestCase{
ds: bd.From("items2"),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items2")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items2")),
},
deleteTestCase{
ds: bd.From(dbv2.C("items2")),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items2")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items2")),
},
deleteTestCase{
ds: bd.From(dbv2.T("items2")),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.T("items2")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items2")),
},
deleteTestCase{
ds: bd.From("schema.table"),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.I("schema.table")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("schema.table")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
@@ -172,19 +172,19 @@ func (dds *deleteDatasetSuite) TestWhere() {
deleteTestCase{
ds: bd.Where(dbv2.Ex{"a": 1}),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
WhereAppend(dbv2.Ex{"a": 1}),
},
deleteTestCase{
ds: bd.Where(dbv2.Ex{"a": 1}).Where(dbv2.C("b").Eq("c")),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
WhereAppend(dbv2.Ex{"a": 1}).
WhereAppend(dbv2.C("b").Eq("c")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
}
@@ -195,12 +195,12 @@ func (dds *deleteDatasetSuite) TestClearWhere() {
deleteTestCase{
ds: bd.ClearWhere(),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")),
SetFrom(exp.NewColumnListExpression("items")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
WhereAppend(dbv2.Ex{"a": 1}),
},
)
@@ -212,24 +212,24 @@ func (dds *deleteDatasetSuite) TestOrder() {
deleteTestCase{
ds: bd.Order(dbv2.C("a").Asc()),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc()),
},
deleteTestCase{
ds: bd.Order(dbv2.C("a").Asc()).Order(dbv2.C("b").Desc()),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("b").Desc()),
},
deleteTestCase{
ds: bd.Order(dbv2.C("a").Asc(), dbv2.C("b").Desc()),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc(), dbv2.C("b").Desc()),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
}
@@ -240,13 +240,13 @@ func (dds *deleteDatasetSuite) TestOrderAppend() {
deleteTestCase{
ds: bd.OrderAppend(dbv2.C("b").Desc()),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc(), dbv2.C("b").Desc()),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc()),
},
)
@@ -258,13 +258,13 @@ func (dds *deleteDatasetSuite) TestOrderPrepend() {
deleteTestCase{
ds: bd.OrderPrepend(dbv2.C("b").Desc()),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("b").Desc(), dbv2.C("a").Asc()),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc()),
},
)
@@ -275,12 +275,12 @@ func (dds *deleteDatasetSuite) TestClearOrder() {
dds.assertCases(
deleteTestCase{
ds: bd.ClearOrder(),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetOrder(dbv2.C("a").Asc()),
},
)
@@ -292,26 +292,26 @@ func (dds *deleteDatasetSuite) TestLimit() {
deleteTestCase{
ds: bd.Limit(10),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("test")).
SetFrom(exp.NewColumnListExpression("test")).
SetLimit(uint(10)),
},
deleteTestCase{
ds: bd.Limit(0),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")),
},
deleteTestCase{
ds: bd.Limit(10).Limit(2),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("test")).
SetFrom(exp.NewColumnListExpression("test")).
SetLimit(uint(2)),
},
deleteTestCase{
ds: bd.Limit(10).Limit(0),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")),
},
)
}
@@ -322,18 +322,18 @@ func (dds *deleteDatasetSuite) TestLimitAll() {
deleteTestCase{
ds: bd.LimitAll(),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("test")).
SetFrom(exp.NewColumnListExpression("test")).
SetLimit(dbv2.L("ALL")),
},
deleteTestCase{
ds: bd.Limit(10).LimitAll(),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("test")).
SetFrom(exp.NewColumnListExpression("test")).
SetLimit(dbv2.L("ALL")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")),
},
)
}
@@ -343,11 +343,11 @@ func (dds *deleteDatasetSuite) TestClearLimit() {
dds.assertCases(
deleteTestCase{
ds: bd.ClearLimit(),
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("test")).SetLimit(uint(10)),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("test")).SetLimit(uint(10)),
},
)
}
@@ -358,30 +358,30 @@ func (dds *deleteDatasetSuite) TestReturning() {
deleteTestCase{
ds: bd.Returning("a"),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetReturning(exp.NewColumnListExpression("a")),
},
deleteTestCase{
ds: bd.Returning(),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetReturning(exp.NewColumnListExpression()),
},
deleteTestCase{
ds: bd.Returning(nil),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetReturning(exp.NewColumnListExpression()),
},
deleteTestCase{
ds: bd.Returning("a").Returning("b"),
clauses: exp.NewDeleteClauses().
SetFrom(dbv2.C("items")).
SetFrom(exp.NewColumnListExpression("items")).
SetReturning(exp.NewColumnListExpression("b")),
},
deleteTestCase{
ds: bd,
clauses: exp.NewDeleteClauses().SetFrom(dbv2.C("items")),
clauses: exp.NewDeleteClauses().SetFrom(exp.NewColumnListExpression("items")),
},
)
}