Add self join support.

This commit is contained in:
sub0Zero 2019-03-16 20:41:06 +01:00 committed by zer0sub
parent 20c6f39665
commit 1cb997fc54
5 changed files with 89 additions and 15 deletions

View file

@ -27,6 +27,7 @@ type Column interface {
setTableName(table string) error
Eq(rhs Expression) BoolExpression
Neq(rhs Expression) BoolExpression
Gte(rhs Expression) BoolExpression
GteLiteral(rhs interface{}) BoolExpression
@ -109,6 +110,10 @@ func (c *baseColumn) Eq(rhs Expression) BoolExpression {
return Eq(c, rhs)
}
func (c *baseColumn) Neq(rhs Expression) BoolExpression {
return Neq(c, rhs)
}
func (c *baseColumn) Gte(rhs Expression) BoolExpression {
return Gte(c, rhs)
}
@ -198,7 +203,7 @@ type IntegerColumn struct {
// Representation of any integer column
// This function will panic if name is not valid
func IntColumn(name string, nullable NullableColumn) NonAliasColumn {
func IntColumn(name string, nullable NullableColumn) *IntegerColumn {
if !validIdentifierName(name) {
panic("Invalid column name in int column")
}

View file

@ -5,7 +5,6 @@ package sqlbuilder
import (
"bytes"
"fmt"
"github.com/dropbox/godropbox/errors"
)
@ -85,6 +84,7 @@ func NewTable(schemaName, name string, columns ...NonAliasColumn) *Table {
type Table struct {
schemaName string
name string
alias string
columns []NonAliasColumn
columnLookup map[string]NonAliasColumn
// If not empty, the name of the index to force
@ -119,6 +119,17 @@ func (t *Table) Projections() []Projection {
return result
}
func (t *Table) SetAlias(alias string) {
t.alias = alias
for _, c := range t.columns {
err := c.setTableName(alias)
if err != nil {
panic(err)
}
}
}
// Returns the table's name in the database
func (t *Table) Name() string {
return t.name
@ -151,6 +162,11 @@ func (t *Table) SerializeSql(out *bytes.Buffer) error {
_, _ = out.WriteString(".")
_, _ = out.WriteString(t.Name())
if len(t.alias) > 0 {
out.WriteString(" AS ")
out.WriteString(t.alias)
}
if t.forcedIndex != "" {
if !validIdentifierName(t.forcedIndex) {
return errors.Newf("'%s' is not a valid identifier for an index", t.forcedIndex)