aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/plan.go24
-rw-r--r--internal/plan_test.go16
2 files changed, 40 insertions, 0 deletions
diff --git a/internal/plan.go b/internal/plan.go
index ac199bf..7dc3361 100644
--- a/internal/plan.go
+++ b/internal/plan.go
@@ -23,6 +23,7 @@ type Plan struct {
IndexByColumnName map[string][]int
// Planned queries.
+ Select PlannedQuery // only `SELECT ... FROM ...` without WHERE or any of the other clauses
Insert PlannedQuery
Update PlannedQuery
Delete PlannedQuery
@@ -126,6 +127,7 @@ func buildPlan(t reflect.Type, dialect Dialect, opts PlanOpts) (Plan, error) {
}
// prepare query strings
+ p.Select = p.buildSelectQueryIfPossible(dialect)
p.Insert = p.buildInsertQueryIfPossible(dialect)
p.Update = p.buildUpdateQueryIfPossible(dialect)
p.Delete = p.buildDeleteQueryIfPossible(dialect)
@@ -153,6 +155,28 @@ func (p Plan) getNonPrimaryKeyColumnNames() []string {
return result
}
+func (p Plan) buildSelectQueryIfPossible(dialect Dialect) PlannedQuery {
+ if p.TableName == "" {
+ return PlannedQuery{Query: ""}
+ }
+
+ var (
+ argumentIndexes = make([][]int, len(p.AllColumnNames))
+ quotedColumnNames = make([]string, len(p.AllColumnNames))
+ )
+ for idx, columnName := range p.AllColumnNames {
+ argumentIndexes[idx] = p.IndexByColumnName[columnName]
+ quotedColumnNames[idx] = dialect.QuoteIdentifier(columnName)
+ }
+
+ query := fmt.Sprintf(
+ `SELECT %s FROM %s WHERE `,
+ strings.Join(quotedColumnNames, ", "),
+ dialect.QuoteIdentifier(p.TableName),
+ )
+ return PlannedQuery{query, argumentIndexes}
+}
+
func (p Plan) buildInsertQueryIfPossible(dialect Dialect) PlannedQuery {
if p.TableName == "" || len(p.AllColumnNames) == 0 {
return PlannedQuery{Query: ""}
diff --git a/internal/plan_test.go b/internal/plan_test.go
index 88afedc..db12943 100644
--- a/internal/plan_test.go
+++ b/internal/plan_test.go
@@ -75,6 +75,8 @@ func TestQueryConstructionBasic(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "ID", "Description", "CreatedAt" FROM "basic_records" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "basic_records" ("Description", "CreatedAt") VALUES ($1, $2) RETURNING "ID"`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{1}, {2}})
assert.Equal(t, plan.Update.Query, `UPDATE "basic_records" SET "Description" = $1, "CreatedAt" = $2 WHERE "ID" = $3`)
@@ -88,6 +90,8 @@ func TestQueryConstructionBasic(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "ID", "Description", "CreatedAt" FROM "basic_records" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "basic_records" ("Description", "CreatedAt") VALUES (?, ?)`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{1}, {2}})
assert.Equal(t, plan.Update.Query, `UPDATE "basic_records" SET "Description" = ?, "CreatedAt" = ? WHERE "ID" = ?`)
@@ -111,6 +115,8 @@ func TestQueryConstructionWithoutPrimaryKey(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "foo_id", "bar_id" FROM "foo_bar_relations" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "foo_bar_relations" ("foo_id", "bar_id") VALUES ($1, $2)`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{0}, {1}})
assert.Equal(t, plan.Update.Query, "")
@@ -124,6 +130,8 @@ func TestQueryConstructionWithoutPrimaryKey(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "foo_id", "bar_id" FROM "foo_bar_relations" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "foo_bar_relations" ("foo_id", "bar_id") VALUES (?, ?)`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{0}, {1}})
assert.Equal(t, plan.Update.Query, "")
@@ -147,6 +155,8 @@ func TestQueryConstructionImpossble(t *testing.T) {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, "")
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, nil)
assert.Equal(t, plan.Insert.Query, "")
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, nil)
assert.Equal(t, plan.Update.Query, "")
@@ -176,6 +186,8 @@ func TestQueryConstructionWithMultiplePrimaryKeyColumns(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "group_id", "name", "created_at" FROM "complex_records" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "complex_records" ("group_id", "name", "created_at") VALUES ($1, $2, $3)`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Update.Query, `UPDATE "complex_records" SET "created_at" = $1 WHERE "group_id" = $2 AND "name" = $3`)
@@ -189,6 +201,8 @@ func TestQueryConstructionWithMultiplePrimaryKeyColumns(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "group_id", "name", "created_at" FROM "complex_records" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "complex_records" ("group_id", "name", "created_at") VALUES (?, ?, ?)`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Update.Query, `UPDATE "complex_records" SET "created_at" = ? WHERE "group_id" = ? AND "name" = ?`)
@@ -214,6 +228,8 @@ func TestQueryConstructionWithMultipleAutoColumns(t *testing.T) {
if err != nil {
t.Error(err)
}
+ assert.Equal(t, plan.Select.Query, `SELECT "id", "name", "created_at" FROM "autogenerated_records" WHERE `)
+ assert.DeepEqual(t, plan.Select.ArgumentIndexes, [][]int{{0}, {1}, {2}})
assert.Equal(t, plan.Insert.Query, `INSERT INTO "autogenerated_records" ("name") VALUES ($1) RETURNING "id", "created_at"`)
assert.DeepEqual(t, plan.Insert.ArgumentIndexes, [][]int{{1}})
assert.Equal(t, plan.Update.Query, `UPDATE "autogenerated_records" SET "name" = $1, "created_at" = $2 WHERE "id" = $3`)