package orm import ( "fmt" "strings" "github.com/huandu/go-sqlbuilder" ) var SqlFlavor = sqlbuilder.MySQL type SqlType uint8 const ( Select SqlType = iota << 1 Update Insert Delete ) type selectBuilder struct { *sqlbuilder.SelectBuilder } /*type selectBuilder struct { b sqlbuilder.Builder } type selectBuilder struct { b sqlbuilder.Builder } type selectBuilder struct { b sqlbuilder.Builder }*/ func getSelectBuilder(tbl *table) *selectBuilder { return &selectBuilder{ sqlbuilder.NewSelectBuilder().From(tbl.getNameAs(true)), } } func (sb *selectBuilder) _select(tbls ...*table) *selectBuilder { cols := []string{} for _, tbl := range tbls { for _, col := range tbl.getColumns() { cols = append(cols, col.getName(true, tbl)) } } sb.Select(cols...) return sb } func (sb *selectBuilder) _where(tbl *table, i MappableInterface) *selectBuilder { tmp := tbl.Make() where := []string{} outerloop: for _, col := range tbl.getColumns() { fn := "Get" + strings.Title(col.getFieldName()) val, err := tbl.CallMethod(i, fn) if err == nil { tmpv, _ := tbl.CallMethod(tmp, fn) for i, v := range val { if v == tmpv[i] { continue outerloop } } where = append(where, sb.Equal(col.getName(true, tbl), val[0])) } else { fmt.Println(err) } } sb.Where(where...) return sb } func (sb *selectBuilder) _wherePrimaryOrElse(tbl *table, i MappableInterface) *selectBuilder { if pk := tbl.getPrimaryKey(); pk != nil { val, err := tbl.CallMethod(i, "Get"+strings.Title(pk.getFieldName())) if err != nil { sb._where(tbl, i) } else { sb.Where(sb.Equal(pk.getName(true, tbl), val[0])) } } else { sb._where(tbl, i) } return sb } func (sb *selectBuilder) _join(tbl *table, rel relation, opt ...sqlbuilder.JoinOption) *selectBuilder { if len(opt) == 0 { sb.Join(rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel.table), sqlbuilder.Raw(rel.key.getName(true, tbl)))) } else { sb.JoinWithOption(opt[0], rel.getNameAs(true), sb.Equal(rel.on.getName(true, rel.table), sqlbuilder.Raw(rel.key.getName(true, tbl)))) } return sb }