Skip to content

Commit 27faa85

Browse files
committed
Fix overriding of view name in Querier.
1 parent d194063 commit 27faa85

File tree

4 files changed

+62
-20
lines changed

4 files changed

+62
-20
lines changed

querier.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import (
88

99
// Querier performs queries and commands.
1010
type Querier struct {
11-
dbtx DBTX
12-
tag string
13-
viewName string
11+
dbtx DBTX
12+
tag string
13+
qualifiedViewName string
1414
Dialect
1515
Logger Logger
1616
}
@@ -51,24 +51,25 @@ func (q *Querier) WithTag(format string, args ...interface{}) *Querier {
5151
} else {
5252
newQ.tag = fmt.Sprintf(format, args...)
5353
}
54+
newQ.qualifiedViewName = q.qualifiedViewName
5455
return newQ
5556
}
5657

57-
// WithView returns a copy of Querier with appointed view name.
58-
func (q *Querier) WithView(viewName string) *Querier {
58+
// WithQualifiedViewName returns a copy of Querier with set qualified view name.
59+
// Returned Querier is tied to the same DB or TX.
60+
// TODO Support INSERT/UPDATE/DELETE. More test.
61+
func (q *Querier) WithQualifiedViewName(qualifiedViewName string) *Querier {
5962
newQ := newQuerier(q.dbtx, q.Dialect, q.Logger)
60-
newQ.viewName = viewName
63+
newQ.tag = q.tag
64+
newQ.qualifiedViewName = qualifiedViewName
6165
return newQ
6266
}
6367

64-
// QualifiedView returns quoted qualified view name.
68+
// QualifiedView returns quoted qualified view name of given view.
6569
func (q *Querier) QualifiedView(view View) string {
6670
v := q.QuoteIdentifier(view.Name())
67-
if q.viewName != "" {
68-
v = q.QuoteIdentifier(q.viewName)
69-
}
70-
if view.Schema() != "" {
71-
v = q.QuoteIdentifier(view.Schema()) + "." + v
71+
if s := view.Schema(); s != "" {
72+
v = q.QuoteIdentifier(s) + "." + v
7273
}
7374
return v
7475
}

querier_examples_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,18 @@ func ExampleQuerier_WithTag() {
8181
// Name: `Vicious Baron` (string), ID: `baron` (string), Start: 2014-06-01 00:00:00 +0000 UTC (time.Time), End: 2016-02-21 00:00:00 +0000 UTC (*time.Time)
8282
}
8383

84-
func ExampleQuerier_WithView() {
85-
id := 1
86-
view := fmt.Sprintf("people_%d", id%3)
87-
person, err := DB.WithView(view).FindByPrimaryKeyFrom(PersonTable, id)
84+
func ExampleQuerier_WithQualifiedViewName() {
85+
_, err := DB.WithQualifiedViewName("people_0").FindByPrimaryKeyFrom(PersonTable, 1)
86+
if err != reform.ErrNoRows {
87+
log.Fatal(err)
88+
}
89+
person, err := DB.WithQualifiedViewName("people_1").FindByPrimaryKeyFrom(PersonTable, 1)
8890
if err != nil {
8991
log.Fatal(err)
9092
}
91-
fmt.Printf("%s: %s", view, person)
93+
fmt.Println(person)
9294
// Output:
93-
// people_1: ID: 1 (int32), GroupID: 65534 (*int32), Name: `Denis Mills` (string), Email: <nil> (*string), CreatedAt: 2009-11-10 23:00:00 +0000 UTC (time.Time), UpdatedAt: <nil> (*time.Time)
95+
// ID: 1 (int32), GroupID: 65534 (*int32), Name: `Denis Mills` (string), Email: <nil> (*string), CreatedAt: 2009-11-10 23:00:00 +0000 UTC (time.Time), UpdatedAt: <nil> (*time.Time)
9496
}
9597

9698
func ExampleQuerier_SelectRows() {

querier_selects.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ func (q *Querier) selectQuery(view View, tail string, limit1 bool) string {
4242
query += " TOP 1"
4343
}
4444

45-
return fmt.Sprintf("%s %s FROM %s %s",
46-
query, strings.Join(q.QualifiedColumns(view), ", "), q.QualifiedView(view), tail)
45+
from := q.QualifiedView(view)
46+
if q.qualifiedViewName != "" {
47+
from = q.qualifiedViewName + " AS " + from
48+
}
49+
50+
return fmt.Sprintf("%s %s FROM %s %s", query, strings.Join(q.QualifiedColumns(view), ", "), from, tail)
4751
}
4852

4953
// SelectOneTo queries str's View with tail and args and scans first result to str.

querier_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package reform_test
2+
3+
import (
4+
"gopkg.in/reform.v1/dialects/mssql"
5+
"gopkg.in/reform.v1/dialects/mysql"
6+
"gopkg.in/reform.v1/dialects/postgresql"
7+
"gopkg.in/reform.v1/dialects/sqlite3"
8+
"gopkg.in/reform.v1/dialects/sqlserver"
9+
. "gopkg.in/reform.v1/internal/test/models"
10+
)
11+
12+
func (s *ReformSuite) TestQualifiedView() {
13+
switch s.q.Dialect {
14+
case postgresql.Dialect:
15+
s.Equal(`"people"`, s.q.QualifiedView(PersonTable))
16+
s.Equal(`"people"`, s.q.WithQualifiedViewName("ignored").QualifiedView(PersonTable))
17+
s.Equal(`"legacy"."people"`, s.q.QualifiedView(LegacyPersonTable))
18+
s.Equal(`"legacy"."people"`, s.q.WithQualifiedViewName("ignored").QualifiedView(LegacyPersonTable))
19+
20+
case mysql.Dialect:
21+
s.Equal("`people`", s.q.QualifiedView(PersonTable))
22+
s.Equal("`people`", s.q.WithQualifiedViewName("ignored").QualifiedView(PersonTable))
23+
24+
case sqlite3.Dialect:
25+
s.Equal(`"people"`, s.q.QualifiedView(PersonTable))
26+
s.Equal(`"people"`, s.q.WithQualifiedViewName("ignored").QualifiedView(PersonTable))
27+
28+
case mssql.Dialect, sqlserver.Dialect:
29+
s.Equal(`[people]`, s.q.QualifiedView(PersonTable))
30+
s.Equal(`[people]`, s.q.WithQualifiedViewName("ignored").QualifiedView(PersonTable))
31+
32+
default:
33+
s.Fail("Unhandled dialect", s.q.Dialect.String())
34+
}
35+
}

0 commit comments

Comments
 (0)