diff --git a/dialect/sql/graph.go b/dialect/sql/graph.go index 0e4d660d0..51e58394e 100644 --- a/dialect/sql/graph.go +++ b/dialect/sql/graph.go @@ -115,7 +115,7 @@ func SetNeighbors(dialect string, s *Step) (q *Selector) { pk1, pk2 = pk2, pk1 } to := builder.Table(s.To.Table) - set.Select(s.From.Column) + set.Select(set.C(s.From.Column)) join := builder.Table(s.Edge.Table) match := builder.Select(join.C(pk1)). From(join). @@ -127,14 +127,14 @@ func SetNeighbors(dialect string, s *Step) (q *Selector) { On(to.C(s.To.Column), match.C(pk1)) case r == M2O || (r == O2O && s.Edge.Inverse): t1 := builder.Table(s.To.Table) - set.Select(s.Edge.Columns[0]) + set.Select(set.C(s.Edge.Columns[0])) q = builder.Select(). From(t1). Join(set). On(t1.C(s.To.Column), set.C(s.Edge.Columns[0])) case r == O2M || (r == O2O && !s.Edge.Inverse): t1 := builder.Table(s.To.Table) - set.Select(s.From.Column) + set.Select(set.C(s.From.Column)) q = builder.Select(). From(t1). Join(set). diff --git a/dialect/sql/graph_test.go b/dialect/sql/graph_test.go index 94e74981a..8436c4cd2 100644 --- a/dialect/sql/graph_test.go +++ b/dialect/sql/graph_test.go @@ -227,7 +227,7 @@ func TestSetNeighbors(t *testing.T) { step.Edge.Columns = []string{"owner_id"} return step }(), - wantQuery: `SELECT * FROM "pets" JOIN (SELECT "id" FROM "users" WHERE "name" = $1) AS "t1" ON "pets"."owner_id" = "t1"."id"`, + wantQuery: `SELECT * FROM "pets" JOIN (SELECT "users"."id" FROM "users" WHERE "name" = $1) AS "t1" ON "pets"."owner_id" = "t1"."id"`, wantArgs: []interface{}{"a8m"}, }, { @@ -244,7 +244,7 @@ func TestSetNeighbors(t *testing.T) { step.Edge.Columns = []string{"owner_id"} return step }(), - wantQuery: `SELECT * FROM "users" JOIN (SELECT "owner_id" FROM "pets" WHERE "name" = $1) AS "t1" ON "users"."id" = "t1"."owner_id"`, + wantQuery: `SELECT * FROM "users" JOIN (SELECT "pets"."owner_id" FROM "pets" WHERE "name" = $1) AS "t1" ON "users"."id" = "t1"."owner_id"`, wantArgs: []interface{}{"pedro"}, }, { @@ -268,7 +268,7 @@ JOIN (SELECT "user_groups"."group_id" FROM "user_groups" JOIN - (SELECT "id" + (SELECT "users"."id" FROM "users" WHERE "name" = $1) AS "t1" ON "user_groups"."user_id" = "t1"."id") AS "t1" ON "groups"."id" = "t1"."group_id"`, wantArgs: []interface{}{"a8m"}, @@ -295,7 +295,7 @@ JOIN (SELECT "user_groups"."user_id" FROM "user_groups" JOIN - (SELECT "id" + (SELECT "groups"."id" FROM "groups" WHERE "name" = $1) AS "t1" ON "user_groups"."group_id" = "t1"."id") AS "t1" ON "users"."id" = "t1"."user_id"`, wantArgs: []interface{}{"GitHub"}, diff --git a/entc/gen/internal/bindata.go b/entc/gen/internal/bindata.go index 2cfb94d12..3a5f4bbef 100644 --- a/entc/gen/internal/bindata.go +++ b/entc/gen/internal/bindata.go @@ -761,7 +761,7 @@ func templateDialectSqlPredicateTmpl() (*asset, error) { return a, nil } -var _templateDialectSqlQueryTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\xdd\x6f\x1b\xb9\x11\x7f\x96\xfe\x8a\x39\x23\x3d\xec\x0a\x0a\x65\x2b\x79\x69\x02\x17\x48\x1d\x1f\xa0\xf6\x6c\x5f\x6d\xa3\x7d\x08\x82\x82\xde\x9d\x95\x78\x5e\x91\x32\x49\xc9\x36\x74\xfb\xbf\x17\x33\xe4\xae\x56\x5f\xb1\x75\x77\xe8\xdd\x43\x90\x25\xe7\x93\x33\xbf\xf9\x90\x97\xcb\x41\xaf\x7b\x66\x66\xcf\x56\x8d\x27\x1e\x86\xc7\x27\x7f\x7d\x3b\xb3\xe8\x50\x7b\xf8\x41\x66\x78\x67\xcc\x3d\x8c\x74\x26\xe0\x53\x59\x02\x33\x39\x20\xba\x5d\x60\x2e\xba\xb7\x13\xe5\xc0\x99\xb9\xcd\x10\x32\x93\x23\x28\x07\xa5\xca\x50\x3b\xcc\x61\xae\x73\xb4\xe0\x27\x08\x9f\x66\x32\x9b\x20\x0c\xc5\x71\x4d\x85\xc2\xcc\x75\xde\x55\x9a\xe9\x3f\x8e\xce\xce\x2f\x6f\xce\xa1\x50\x25\x42\xbc\xb3\xc6\x78\xc8\x95\xc5\xcc\x1b\xfb\x0c\xa6\x00\xdf\x32\xe6\x2d\xa2\xe8\xf6\x06\x55\xd5\xed\x2e\x97\x90\x63\xa1\x34\xc2\x51\xae\x64\x89\x99\x1f\xb8\x87\x72\xf0\x30\x47\xfb\x7c\x04\x55\x45\x0c\x6f\x66\xf7\x63\xf8\x70\x0a\x6f\xc4\x4d\x66\x66\x28\x7e\x92\xd9\xbd\x1c\x63\x4d\xbd\x9b\xab\x92\x9c\xfd\x70\x0a\x33\xe9\x32\x59\x36\x8c\x7f\x8f\x94\xc8\x68\x31\x43\xb5\x08\x9c\xcd\x77\x23\x4e\xde\x14\x73\x9d\x41\xb2\xc6\x5b\x55\xd0\x6b\x5b\xa9\xaa\x14\xdc\x43\xf9\xa9\x2c\x93\xcc\x3f\x41\x66\xb4\xc7\x27\x2f\xce\xc2\xff\x29\x24\x5f\xbe\x32\xbf\xb8\x94\x53\x72\xb1\x0f\x68\xad\xb1\x29\x2c\xbb\x1d\x6b\x1e\x1d\x19\xff\xde\x3d\x94\xe2\xda\x3c\xba\x65\xd5\xed\x38\x2c\x39\x4c\x44\xd8\xb0\x2c\xdc\x43\xf9\x2f\x8a\x44\x92\x76\x3b\xaa\x80\xb9\x56\x0f\x73\xdc\xc5\x18\x28\x1f\xa1\x44\x9d\x84\xef\x14\x4e\x4f\xe1\x98\xac\x36\x16\xc4\x67\xe5\xbc\xd2\x99\x27\x75\x55\xb7\xc3\x41\xee\x83\xb4\x63\xf6\xaa\x61\x6b\x9b\x44\xbb\xd3\xb1\xdc\xd2\x57\xe4\xcc\xfc\x53\x1f\x5a\xca\xfa\x40\x0f\x4d\x3f\xb2\xf0\x77\xa7\xa0\x55\xc9\x7e\x58\xf4\x73\xab\xe9\xc8\x41\x61\x1f\x72\x2c\xd0\x32\xbf\x38\x2b\x8d\x43\x32\xbb\x5c\xbe\x25\x6b\x9e\x33\x5a\xce\x2d\x67\xf4\x7a\x65\xbd\xdb\x59\x48\x1b\x5d\xf2\x94\xa0\xe5\x72\xc5\xc7\x61\x67\xa6\x4d\xef\x89\x55\xfc\x60\xcd\x94\x22\x9f\xbc\xde\xc5\x96\x74\x66\x74\xa1\xc6\x9b\x00\x89\xd7\x69\xb7\x16\x5f\x49\xf4\x49\x55\xf7\x20\x64\x9d\x99\xb9\xf6\x7b\xb0\xa5\xb4\xff\xdd\xf0\xb4\x02\xd3\x97\xaf\xce\x5b\xa5\xc7\x4b\xe6\x6f\x95\x97\xe0\xf3\xe8\x33\x79\xe0\xbc\xd4\x1c\xec\x10\x59\x02\xda\x6e\x10\xa6\xf0\xb7\x88\xbb\x68\x61\x1f\x5a\x39\xb8\x0d\xe8\xc2\xb3\xe9\x21\x0d\x4a\x5b\xb4\x72\x3e\xd5\x2e\x22\x5b\x08\x91\xd2\xbf\xf4\x0f\x43\xf0\xf1\xb7\xf1\xab\x0a\xf8\x8e\x6f\x2e\xf1\xc9\x27\xe9\xb6\xa4\xb1\x44\x7b\x4c\x8e\xea\xe6\x56\x55\x1f\x40\x1b\x56\x13\x9a\xeb\x51\xa8\x50\xc2\xb9\x06\xa5\x7d\xfb\x25\xac\xfa\x26\x93\x3a\xf9\x5e\x7f\xcb\xc5\x62\xea\xc5\x39\x19\x2b\xd6\x0d\x15\x52\x95\x98\x83\x45\x99\x2b\x3d\x86\x8c\x02\xff\x01\xfe\xb2\x38\x62\xdf\x82\xe1\xba\x0e\x7e\x05\x7e\xcf\x9f\x94\xdb\x87\xdf\x3b\x63\xca\x36\x80\x75\x7f\x5f\x7a\xda\x85\xb0\xca\xe3\xf6\x3b\x0b\x59\x3a\xdc\xff\xd6\x6c\x82\xd9\x3d\x20\xb9\x84\x3a\xc3\x7d\xcf\x24\xc8\xfe\x8a\xa7\x46\x98\x41\x8f\x60\x7b\x53\xd7\xdd\xb2\xdb\x69\x8d\xa4\x80\x68\x9e\x6c\x5b\x05\x13\x31\x58\x93\x09\xd1\xfe\x84\x84\xa2\xbc\xb8\x95\x77\x25\x26\x9b\x55\xc9\xb7\xe9\x7a\xa5\xd7\x12\xc1\x8b\xc4\x9f\x34\x45\xb3\x29\x1d\xef\xeb\x2a\xe2\x8e\x98\xf8\x93\x10\xe4\x1d\x69\x68\x07\xbd\xb1\xb8\x33\x61\xed\x51\x13\xfd\xd8\x2a\xe1\x17\xbc\xe1\xac\x14\xc6\xc2\x7f\xfb\x30\x63\xb0\x4b\x3d\xc6\x2d\x63\x33\x8b\xb9\xca\xa4\x47\xc7\x6e\xcd\x1a\x3b\xaf\x55\x60\x2c\xa5\x67\x97\xac\x2a\xc0\x14\x85\x0b\xd3\x67\x4b\x8c\x29\x1f\x6b\x8e\x56\x64\x06\x03\x28\xd5\x54\x79\x5a\xa2\xa6\x52\xe7\x92\x17\x1f\x72\x24\xf2\x66\xa5\x9c\x3b\x14\xf0\x1f\x04\xe7\xa5\xf5\x41\xe6\x51\xf9\x09\x2d\x40\x72\x5e\x7a\x58\xc8\x72\x8e\x7d\x90\x3a\x07\xb3\x40\x6b\x15\xed\x64\x1e\xee\xb0\x34\x8f\xa0\x0a\xd0\x88\x39\x2d\x6e\xad\x30\x5f\xb1\xf2\xa4\x17\x8c\xa4\xe2\x47\xf2\x21\x99\x4a\x3f\x11\x17\xf2\x69\xa4\xfd\xbb\x61\xf3\xac\xe0\xdf\x8e\x57\x31\xe1\x63\xa4\xef\xc8\x76\xd4\xda\x63\x86\xb5\xc2\xa9\x39\xba\xbc\x60\xa1\xce\x21\xec\x74\x83\x5e\xe8\xa6\x83\x99\x0c\xef\x53\x1a\x1d\x6f\x86\x7c\x0d\x63\xd4\x68\xa5\x57\x46\x73\x88\x98\xcb\x14\x20\x61\xac\x16\xa8\x01\xf3\x31\x0a\xe0\x05\xf1\x5b\xfb\x21\x6b\xe7\x25\x31\xac\x0c\xd8\x5e\x12\xcf\x73\x06\x18\xb0\x33\x64\x99\x94\xc2\x23\x72\x14\xc1\x1b\xf6\x61\x6c\xa5\x47\xa6\xb2\x0b\xde\x44\xab\xf5\x0a\xb2\xda\x17\x6b\xb5\xed\x35\xe4\xb7\xd4\x39\x19\x50\x05\xbc\x41\x71\x31\xbc\xe0\x27\xf0\x9e\xa1\x48\xd5\x09\x54\x15\x1d\x7e\xa6\xc3\x31\x1f\x6a\xe6\x91\x1b\xe9\x05\x5a\x87\x91\x45\x41\xcd\x41\xec\x8d\x28\x65\xe2\x2d\x2b\xdd\xd7\x4f\x50\xdc\x3e\xaf\xad\xd2\x4d\x57\xe9\xf8\xe1\x4b\xab\x43\xc7\x0f\x9b\x46\x33\x14\x67\x5b\x45\xbd\x63\x6d\x48\x59\xec\xdd\xcb\xcd\x2d\x3a\x47\xb4\xb6\x38\x49\xbf\xdf\xd5\xe8\xde\xed\xb1\x8f\xe2\xa7\x7f\xb6\x14\x7c\x09\xd1\xaa\xaa\xaf\x69\x4a\x15\xd4\xe9\x84\xbe\xf7\x2e\x9e\xfe\x61\x94\x4e\xfc\x30\x9e\xae\xf4\x61\x8a\x7f\x66\xc5\x7d\x38\x28\x1a\x8c\x61\xee\xb0\x5b\xaf\x0a\x6e\xd4\x9d\x99\x0f\xc1\xc1\xf7\xe1\x40\xfe\x9d\x44\x53\xdb\x99\x6c\xdd\x6e\x98\xed\x83\x7f\x7f\x78\xbc\x02\x5a\xb1\x74\x48\x28\x34\x36\xa0\xf6\x0a\x12\xea\x54\x6f\x50\x5c\x0d\xaf\xd6\xb0\x99\x32\x08\x07\x3d\x20\xa6\x5f\x7e\x81\x84\x18\xb8\xd3\xa9\x08\x5e\xaa\xc5\x34\x96\xda\x1f\x07\x51\x8c\xd3\xe7\x80\xc4\x6c\xcc\xd5\x6d\x17\x37\xa7\xeb\x9e\x3c\x0e\x7f\x73\x1e\x0f\x7c\x54\x93\xc1\x98\x9a\xab\xe1\xc5\x7a\x6a\xa4\x73\x26\xfb\x93\x24\xe6\xf7\xaa\x96\x1d\x51\x7e\x4d\xb8\x0e\xab\x63\x8e\x6c\x98\x7c\xbb\x67\x60\x61\xcd\xf4\xe5\x19\x28\xc3\xd8\x8b\x44\x96\xa9\xc7\xa1\x36\xf9\xab\xc6\x21\x09\xb5\xc6\xa1\xe6\xb9\xb5\x36\x03\x49\x13\xcd\x40\xde\x40\x5a\xbe\x90\xe4\xda\xe8\xfb\xbf\x8e\x52\x9e\x54\x2a\xdf\x85\x9c\x7a\xf2\x69\x0a\xfc\xc8\xdd\xf0\xef\x54\xa8\x2a\x95\x27\x29\x45\x3b\x20\x7a\xf4\x79\x15\xf9\x8e\xf3\x38\x6b\x7e\x14\xdf\x78\x9c\x2d\xe3\x25\x6f\xba\xe2\xdf\x70\x0a\x2a\x6f\xdf\x30\x78\xe3\x46\xab\xb7\x50\xdd\xe6\x0c\x50\xd9\xc5\x1a\x2e\xd6\xc1\x11\x25\x6f\xcd\x9a\x85\x3d\xc5\xb3\x62\x5e\x33\x72\x40\x53\x88\x1a\x28\x59\xe2\x1a\xa9\x4c\x28\x00\x81\xfd\x1a\x4b\x16\xd9\x60\xab\x77\x89\xda\x56\x7b\xbb\x68\xf3\xed\x8d\xd0\xee\x61\xdd\x16\x8d\xfd\x10\x4e\x41\xce\x66\xa8\xf3\x64\x8b\xd4\x27\xb5\xed\x55\x68\x8f\x95\xb5\xf1\x24\x84\x58\xa5\x7f\x8f\xc0\x56\x61\x37\x20\xa9\xff\x72\x10\xdb\x09\xc5\xe9\x12\xd5\x78\x72\x67\xac\x7b\x71\x79\xeb\x03\x3d\x21\x6d\x15\xfb\xff\x02\x00\x00\xff\xff\x47\x8e\x50\x69\x88\x15\x00\x00") +var _templateDialectSqlQueryTmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\xd1\x6f\xdb\xb6\x13\x7e\x8e\xfe\x8a\x6b\xd0\x5f\x21\x05\x2e\x9d\xe4\xf7\xb4\x04\x19\xd0\xa5\x29\x60\xac\xcd\xba\x38\xd8\x1e\x8a\x62\x60\xa4\x93\x4d\x84\x26\x1d\x92\x72\x12\x18\xfa\xdf\x87\x3b\x4a\xb2\x1c\xdb\x6d\xd6\x0d\xdb\x4b\x1f\x8a\x5a\xbc\xef\xee\x3e\x1e\xef\x23\x2f\xcb\xe5\xf0\x20\x39\xb7\xf3\x47\xa7\x26\xd3\x00\xc7\x87\x47\x3f\xbc\x9e\x3b\xf4\x68\x02\xbc\x93\x39\xde\x58\x7b\x0b\x23\x93\x0b\x78\xa3\x35\x30\xc8\x03\xd9\xdd\x02\x0b\x91\x5c\x4f\x95\x07\x6f\x2b\x97\x23\xe4\xb6\x40\x50\x1e\xb4\xca\xd1\x78\x2c\xa0\x32\x05\x3a\x08\x53\x84\x37\x73\x99\x4f\x11\x8e\xc5\x61\x6b\x85\xd2\x56\xa6\x48\x94\x61\xfb\xfb\xd1\xf9\xc5\xe5\xf8\x02\x4a\xa5\x11\x9a\x35\x67\x6d\x80\x42\x39\xcc\x83\x75\x8f\x60\x4b\x08\xbd\x64\xc1\x21\x8a\xe4\x60\x58\xd7\x49\xb2\x5c\x42\x81\xa5\x32\x08\xfb\x85\x92\x1a\xf3\x30\xf4\x77\x7a\x78\x57\xa1\x7b\xdc\x87\xba\x26\xc0\xcb\xf9\xed\x04\x4e\xce\xe0\xa5\x18\xe7\x76\x8e\xe2\xa3\xcc\x6f\xe5\x04\x5b\xeb\x4d\xa5\x34\x91\x3d\x39\x83\xb9\xf4\xb9\xd4\x1d\xf0\xa7\xc6\xd2\x00\x1d\xe6\xa8\x16\x11\xd9\xfd\xee\xdc\x89\x4d\x59\x99\x1c\xd2\x35\x6c\x5d\xc3\x41\x3f\x4b\x5d\x67\xe0\xef\xf4\x1b\xad\xd3\x3c\x3c\x40\x6e\x4d\xc0\x87\x20\xce\xe3\xff\x19\xa4\x9f\x3e\x33\x5e\x5c\xca\x19\x51\x1c\x00\x3a\x67\x5d\x06\xcb\x64\xcf\xd9\x7b\x4f\xc9\x5f\xf9\x3b\x2d\xae\xec\xbd\x5f\xd6\xc9\x9e\x47\xcd\x65\x22\xc3\x93\xcc\xc2\xdf\xe9\x5f\xa9\x12\x69\x96\xec\xa9\x12\x2a\xa3\xee\x2a\xdc\x06\x8c\x96\x53\xd0\x68\xd2\xf8\x3b\x83\xb3\x33\x38\xa4\xac\x5d\x06\xf1\x56\xf9\xa0\x4c\x1e\x28\x5c\x9d\xec\x71\x91\x07\x20\xdd\x84\x59\x75\xb0\x7e\x4a\x74\x5b\x89\x15\x8e\x7e\x35\xc8\x3c\x3c\x0c\xa0\x17\x6c\x00\xb4\xd1\xec\x94\x9d\x5f\x9c\x81\x51\x9a\x79\x38\x0c\x95\x33\xf4\xc9\x45\x61\x0e\x05\x96\xe8\x18\x2f\xce\xb5\xf5\x48\x69\x97\xcb\xd7\x94\x2d\xf0\x89\xea\xca\xf1\x89\x5e\xad\xb2\x27\x7b\x0b\xe9\x1a\x4a\x81\x0e\x68\xb9\x5c\xe1\xb8\xec\x0c\x7a\xca\x9e\xa0\xe2\x9d\xb3\x33\xaa\x7c\xfa\x7c\x8a\x3d\xef\xdc\x9a\x52\x4d\x9e\x36\x48\xb3\x9c\x25\xad\xfb\xca\x63\x40\xa1\x92\xbf\xd4\x59\xe7\xb6\x32\x61\x47\x6f\x29\x13\xfe\xb1\x7e\x5a\x35\xd3\xa7\xcf\x3e\x38\x65\x26\x4b\xc6\xf7\xe4\x25\xf8\x7b\xf4\x96\x18\xf8\x20\x0d\x17\x3b\x56\x96\x1a\x6d\x7b\x13\x66\xf0\x63\xd3\x77\x4d\x86\x5d\xdd\xca\xc5\xed\x9a\x2e\x6e\x9b\x36\xd2\x75\x69\xcf\xa6\xab\x99\xf1\x4d\x67\x0b\x21\x32\xfa\x97\xfd\x67\x1d\x7c\xf8\xe5\xfe\x55\x25\xbc\xe0\x95\x4b\x7c\x08\x69\xb6\xe9\x69\x1d\xd9\xee\xd3\xfd\xf6\x72\xab\xeb\x13\x30\x96\xc3\xc4\xcb\x75\x3f\x2a\x94\xfa\xdc\x80\x32\xa1\xbf\x13\x0e\x3d\xce\xa5\x49\x5f\x99\x2f\x51\x2c\x67\x41\x5c\x50\xb2\x72\x3d\x51\x29\x95\xc6\x02\x1c\xca\x42\x99\x09\xe4\x54\xf8\x13\xf8\xdf\x62\x9f\xb9\xc5\xc4\xad\x0e\xbe\xa1\x7f\x2f\x1e\x94\xdf\xd5\xbf\x37\xd6\xea\x7e\x03\x9b\xc1\xae\xe3\xe9\x0b\x61\x75\x8e\x9b\xfb\x2c\xa5\xf6\xb8\x7b\xaf\xf9\x14\xf3\x5b\x40\xa2\x84\x26\xc7\x5d\xdb\xa4\x96\xfd\x86\xad\x36\x6d\x06\x07\xd4\xb6\xe3\x56\x77\xcb\x64\xaf\xf7\x24\xc5\x8e\xe6\x97\x6d\x43\x30\x4d\x0f\xb6\x66\xea\xe8\x70\x44\x4e\x8d\xbf\xb8\x96\x37\x1a\xd3\xa7\xaa\xe4\xd5\x6c\x5d\xe9\xad\x47\x64\x91\x86\xa3\x4e\x34\x4f\xbd\x9b\xf5\x56\x45\x7c\x23\xa6\xe1\x28\x16\x79\xcb\x31\xf4\x8b\xde\x65\xdc\x7a\x60\xfd\xa7\xa6\xe1\xb1\x21\xe1\xaf\xb0\xe1\x53\x29\xad\x83\x3f\x06\x30\xe7\x66\x97\x66\x82\x1b\xc9\xe6\x0e\x0b\x95\xcb\x80\x9e\x69\xcd\xbb\x3c\xcf\x0d\x60\x1d\x1d\xcf\x36\x5f\x55\x82\x2d\x4b\x1f\x5f\x9f\x0d\x37\xb6\x9c\xb6\x88\x5e\x65\x86\x43\xd0\x6a\xa6\x02\x0d\x51\x33\x69\x0a\xc9\x83\x0f\x11\x69\xb0\xb9\x96\x95\x47\x01\xbf\x23\xf8\x20\x5d\x88\x3e\xf7\x2a\x4c\x69\x00\x92\x95\x0e\xb0\x90\xba\xc2\x01\x48\x53\x80\x5d\xa0\x73\x8a\x66\xb2\x00\x37\xa8\xed\x3d\xa8\x12\x0c\x62\x41\x83\x5b\xaf\xcc\xbf\x70\xf0\xf4\x20\x26\xc9\xc4\x7b\xe2\x90\xce\x64\x98\x8a\x0f\xf2\x61\x64\xc2\xff\x8f\xbb\x6d\x45\x7e\x5b\x76\xc5\x86\xd3\xc6\xbe\xe5\xb4\x9b\xa8\x07\x0c\x58\x13\x4e\x8b\x48\x78\xc0\x42\x53\x40\x9c\xe9\x86\x07\xf1\x36\x1d\xce\x65\xdc\x9f\x32\xe8\x79\x32\xe4\x65\x98\xa0\x41\x27\x83\xb2\x86\x4b\xc4\x28\x5b\x82\x84\x89\x5a\xa0\x01\x2c\x26\x28\x80\x07\xc4\x2f\xcd\x87\x1c\x9d\x87\xc4\x38\x32\x18\x1e\x12\x57\xdf\xd8\x1f\x1a\x2f\x0a\x6e\x38\x60\x72\xc4\x84\x92\xc0\x3d\x72\x55\x21\x58\xe6\x34\x71\x32\x20\x5b\x99\x52\xb0\x0d\x8b\x76\x24\x59\xcd\x8f\x6d\xd8\xb5\xb1\xc4\x07\x9c\x77\xef\xf1\x38\xe0\x7c\xd9\x2c\xb2\xc8\xc4\x6f\xdb\x65\xd3\x3d\x56\x2b\x24\x2b\xbc\x41\x9b\x0d\xe9\xf7\x91\x51\x3f\xdb\xa0\x71\x61\xfd\xf1\x6e\x3c\xaf\xed\x5a\x06\x14\xd7\x8f\x6b\x63\xf5\x5a\x9a\x6b\xbb\x9e\x64\x13\xdd\x5b\xdd\x9a\x8e\x4a\x2f\xae\x50\x43\xbc\x0d\x23\xfc\x0a\x35\xbb\x3c\x81\x8d\xcc\x02\x9d\x5f\x31\x1b\xf9\x76\x65\x1d\xb7\xb3\x42\x0d\x19\x32\xef\x60\xd2\x5c\x39\x70\x06\x72\x3e\x47\x53\xa4\x1b\xa6\x01\x85\x55\x25\x05\xfa\x70\xfc\x01\xea\x7a\x47\x96\x8f\x3f\xf7\x52\x08\x41\xab\xa8\x99\xea\x0e\x87\x18\xbf\xe7\xd4\xa9\xa6\x1d\x66\xf8\xc6\x8d\x75\x1a\x63\xb8\x44\x35\x99\xde\x58\xe7\xbf\xfa\x74\x0c\x80\x76\x91\xed\x90\x61\xe9\xec\xec\xeb\x32\x94\x51\x79\x8d\x91\x7d\x5a\x45\x1a\x5b\x3c\x4b\x91\xe4\xb4\x4d\x91\x2b\xd9\x51\x24\x92\x1d\x5f\x82\x3d\x2e\xe4\xb9\xa6\xb6\x7f\x55\xbd\xaf\xf9\x0f\x86\x62\xdb\xed\x48\xce\xd4\x0b\xac\xa5\x91\x1f\xf3\xa8\x0c\x75\xad\x8a\x34\x5b\x1d\xf8\xe8\xed\xaa\xf2\xcf\xb9\x07\x54\xf1\x5d\xef\xdf\xf5\xbe\xa6\xf7\xbf\x23\xf6\x3f\x03\x00\x00\xff\xff\x38\x98\xd6\xd1\x0b\x12\x00\x00") func templateDialectSqlQueryTmplBytes() ([]byte, error) { return bindataRead( @@ -776,7 +776,7 @@ func templateDialectSqlQueryTmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "template/dialect/sql/query.tmpl", size: 5512, mode: os.FileMode(420), modTime: time.Unix(1, 0)} + info := bindataFileInfo{name: "template/dialect/sql/query.tmpl", size: 4619, mode: os.FileMode(420), modTime: time.Unix(1, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/entc/gen/template/dialect/sql/query.tmpl b/entc/gen/template/dialect/sql/query.tmpl index 15965d508..49be21da5 100644 --- a/entc/gen/template/dialect/sql/query.tmpl +++ b/entc/gen/template/dialect/sql/query.tmpl @@ -88,41 +88,20 @@ func ({{ $receiver }} *{{ $builder }}) sqlQuery() *sql.Selector { {{/* query/path defines the query generation for path of a given edge. */}} {{ define "dialect/sql/query/path" }} + {{- $n := $ }} {{- $e := $.Scope.Edge }} {{/* the edge we need to genegrate the path to. */}} {{- $receiver := $.Scope.Receiver }} - - builder := sql.Dialect({{ $receiver }}.driver.Dialect()) - {{- if $e.M2M }} - {{ $i := 1 }}{{ $j := 0 }}{{- if $e.IsInverse }}{{ $i = 0 }}{{ $j = 1 }}{{ end -}} - t1 := builder.Table({{ $e.Type.Package }}.Table) - t2 := {{ $receiver }}.sqlQuery() - t2.Select(t2.C({{ $.Package }}.{{ $.ID.Constant }})) - t3 := builder.Table({{ $.Package }}.{{ $e.TableConstant }}) - t4 := builder.Select(t3.C({{ $.Package }}.{{ $e.PKConstant }}[{{ $i }}])). - From(t3). - Join(t2). - On(t3.C({{ $.Package }}.{{ $e.PKConstant }}[{{ $j }}]), t2.C({{ $.Package }}.{{ $.ID.Constant }})) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C({{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}), t4.C({{ $.Package }}.{{ $e.PKConstant }}[{{ $i }}])) - {{- else if or $e.M2O (and $e.O2O $e.IsInverse) }}{{/* M2O || (O2O with inverse edge) */}} - t1 := builder.Table({{ $e.Type.Package }}.Table) - t2 := {{ $receiver }}.sqlQuery() - t2.Select(t2.C({{ $.Package }}.{{ $e.ColumnConstant }})) - query.sql = builder.Select(t1.Columns({{ $e.Type.Package }}.Columns...)...). - From(t1). - Join(t2). - On(t1.C({{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}), t2.C({{ $.Package }}.{{ $e.ColumnConstant }})) - {{- else }}{{/* O2M || (O2O with assoc edge) */}} - t1 := builder.Table({{ $e.Type.Package }}.Table) - t2 := {{ $receiver }}.sqlQuery() - t2.Select(t2.C({{ $.Package }}.{{ $.ID.Constant }})) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C({{ $.Package }}.{{ $e.ColumnConstant }}), t2.C({{ $.Package }}.{{ $.ID.Constant }})) - {{- end }} + step := &sql.Step{} + step.From.V = {{ $receiver }}.sqlQuery() + step.From.Table = {{ $n.Package }}.Table + step.From.Column = {{ $n.Package }}.{{ $n.ID.Constant }} + step.To.Table = {{ $e.Type.Package }}.Table + step.To.Column = {{ $e.Type.Package }}.{{ $e.Type.ID.Constant }} + step.Edge.Rel = sql.{{ $e.Rel.Type }} + step.Edge.Inverse = {{ $e.IsInverse }} + step.Edge.Table = {{ $n.Package }}.{{ $e.TableConstant }} + step.Edge.Columns = append(step.Edge.Columns, {{ if $e.M2M }}{{ $n.Package }}.{{ $e.PKConstant }}...{{ else }}{{ $n.Package }}.{{ $e.ColumnConstant }}{{ end }}) + query.sql = sql.SetNeighbors({{ $receiver }}.driver.Dialect(), step) {{ end }} {{/* query/from defines the query generation for an edge query from a given node. */}} diff --git a/entc/integration/ent/card_query.go b/entc/integration/ent/card_query.go index cab93426e..3ca934bcc 100644 --- a/entc/integration/ent/card_query.go +++ b/entc/integration/ent/card_query.go @@ -65,15 +65,17 @@ func (cq *CardQuery) QueryOwner() *UserQuery { query := &UserQuery{config: cq.config} switch cq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(cq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := cq.sqlQuery() - t2.Select(t2.C(card.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(card.OwnerColumn)) + step := &sql.Step{} + step.From.V = cq.sqlQuery() + step.From.Table = card.Table + step.From.Column = card.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = true + step.Edge.Table = card.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, card.OwnerColumn) + query.sql = sql.SetNeighbors(cq.driver.Dialect(), step) case dialect.Gremlin: gremlin := cq.gremlinQuery() query.gremlin = gremlin.InE(user.CardLabel).OutV() diff --git a/entc/integration/ent/file_query.go b/entc/integration/ent/file_query.go index 9a3a423ab..559120a3e 100644 --- a/entc/integration/ent/file_query.go +++ b/entc/integration/ent/file_query.go @@ -66,15 +66,17 @@ func (fq *FileQuery) QueryOwner() *UserQuery { query := &UserQuery{config: fq.config} switch fq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(fq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := fq.sqlQuery() - t2.Select(t2.C(file.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(file.OwnerColumn)) + step := &sql.Step{} + step.From.V = fq.sqlQuery() + step.From.Table = file.Table + step.From.Column = file.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = file.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, file.OwnerColumn) + query.sql = sql.SetNeighbors(fq.driver.Dialect(), step) case dialect.Gremlin: gremlin := fq.gremlinQuery() query.gremlin = gremlin.InE(user.FilesLabel).OutV() @@ -87,15 +89,17 @@ func (fq *FileQuery) QueryType() *FileTypeQuery { query := &FileTypeQuery{config: fq.config} switch fq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(fq.driver.Dialect()) - t1 := builder.Table(filetype.Table) - t2 := fq.sqlQuery() - t2.Select(t2.C(file.TypeColumn)) - query.sql = builder.Select(t1.Columns(filetype.Columns...)...). - From(t1). - Join(t2). - On(t1.C(filetype.FieldID), t2.C(file.TypeColumn)) + step := &sql.Step{} + step.From.V = fq.sqlQuery() + step.From.Table = file.Table + step.From.Column = file.FieldID + step.To.Table = filetype.Table + step.To.Column = filetype.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = file.TypeTable + step.Edge.Columns = append(step.Edge.Columns, file.TypeColumn) + query.sql = sql.SetNeighbors(fq.driver.Dialect(), step) case dialect.Gremlin: gremlin := fq.gremlinQuery() query.gremlin = gremlin.InE(filetype.FilesLabel).OutV() diff --git a/entc/integration/ent/filetype_query.go b/entc/integration/ent/filetype_query.go index 2b63344fb..8746c3d65 100644 --- a/entc/integration/ent/filetype_query.go +++ b/entc/integration/ent/filetype_query.go @@ -65,15 +65,17 @@ func (ftq *FileTypeQuery) QueryFiles() *FileQuery { query := &FileQuery{config: ftq.config} switch ftq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(ftq.driver.Dialect()) - t1 := builder.Table(file.Table) - t2 := ftq.sqlQuery() - t2.Select(t2.C(filetype.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(filetype.FilesColumn), t2.C(filetype.FieldID)) + step := &sql.Step{} + step.From.V = ftq.sqlQuery() + step.From.Table = filetype.Table + step.From.Column = filetype.FieldID + step.To.Table = file.Table + step.To.Column = file.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = filetype.FilesTable + step.Edge.Columns = append(step.Edge.Columns, filetype.FilesColumn) + query.sql = sql.SetNeighbors(ftq.driver.Dialect(), step) case dialect.Gremlin: gremlin := ftq.gremlinQuery() query.gremlin = gremlin.OutE(filetype.FilesLabel).InV() diff --git a/entc/integration/ent/group_query.go b/entc/integration/ent/group_query.go index fa69a7a7c..e1d74f2fc 100644 --- a/entc/integration/ent/group_query.go +++ b/entc/integration/ent/group_query.go @@ -67,15 +67,17 @@ func (gq *GroupQuery) QueryFiles() *FileQuery { query := &FileQuery{config: gq.config} switch gq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(file.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(group.FilesColumn), t2.C(group.FieldID)) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = file.Table + step.To.Column = file.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = group.FilesTable + step.Edge.Columns = append(step.Edge.Columns, group.FilesColumn) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) case dialect.Gremlin: gremlin := gq.gremlinQuery() query.gremlin = gremlin.OutE(group.FilesLabel).InV() @@ -88,15 +90,17 @@ func (gq *GroupQuery) QueryBlocked() *UserQuery { query := &UserQuery{config: gq.config} switch gq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(group.BlockedColumn), t2.C(group.FieldID)) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = group.BlockedTable + step.Edge.Columns = append(step.Edge.Columns, group.BlockedColumn) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) case dialect.Gremlin: gremlin := gq.gremlinQuery() query.gremlin = gremlin.OutE(group.BlockedLabel).InV() @@ -109,20 +113,17 @@ func (gq *GroupQuery) QueryUsers() *UserQuery { query := &UserQuery{config: gq.config} switch gq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - t3 := builder.Table(group.UsersTable) - t4 := builder.Select(t3.C(group.UsersPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(group.UsersPrimaryKey[1]), t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(group.UsersPrimaryKey[0])) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = group.UsersTable + step.Edge.Columns = append(step.Edge.Columns, group.UsersPrimaryKey...) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) case dialect.Gremlin: gremlin := gq.gremlinQuery() query.gremlin = gremlin.InE(user.GroupsLabel).OutV() @@ -135,15 +136,17 @@ func (gq *GroupQuery) QueryInfo() *GroupInfoQuery { query := &GroupInfoQuery{config: gq.config} switch gq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(groupinfo.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.InfoColumn)) - query.sql = builder.Select(t1.Columns(groupinfo.Columns...)...). - From(t1). - Join(t2). - On(t1.C(groupinfo.FieldID), t2.C(group.InfoColumn)) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = groupinfo.Table + step.To.Column = groupinfo.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = false + step.Edge.Table = group.InfoTable + step.Edge.Columns = append(step.Edge.Columns, group.InfoColumn) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) case dialect.Gremlin: gremlin := gq.gremlinQuery() query.gremlin = gremlin.OutE(group.InfoLabel).InV() diff --git a/entc/integration/ent/groupinfo_query.go b/entc/integration/ent/groupinfo_query.go index 425316a10..ff3da2711 100644 --- a/entc/integration/ent/groupinfo_query.go +++ b/entc/integration/ent/groupinfo_query.go @@ -65,15 +65,17 @@ func (giq *GroupInfoQuery) QueryGroups() *GroupQuery { query := &GroupQuery{config: giq.config} switch giq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(giq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := giq.sqlQuery() - t2.Select(t2.C(groupinfo.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(groupinfo.GroupsColumn), t2.C(groupinfo.FieldID)) + step := &sql.Step{} + step.From.V = giq.sqlQuery() + step.From.Table = groupinfo.Table + step.From.Column = groupinfo.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = true + step.Edge.Table = groupinfo.GroupsTable + step.Edge.Columns = append(step.Edge.Columns, groupinfo.GroupsColumn) + query.sql = sql.SetNeighbors(giq.driver.Dialect(), step) case dialect.Gremlin: gremlin := giq.gremlinQuery() query.gremlin = gremlin.InE(group.InfoLabel).OutV() diff --git a/entc/integration/ent/node_query.go b/entc/integration/ent/node_query.go index 448e0562a..395e180de 100644 --- a/entc/integration/ent/node_query.go +++ b/entc/integration/ent/node_query.go @@ -64,15 +64,17 @@ func (nq *NodeQuery) QueryPrev() *NodeQuery { query := &NodeQuery{config: nq.config} switch nq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.PrevColumn)) - query.sql = builder.Select(t1.Columns(node.Columns...)...). - From(t1). - Join(t2). - On(t1.C(node.FieldID), t2.C(node.PrevColumn)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = true + step.Edge.Table = node.PrevTable + step.Edge.Columns = append(step.Edge.Columns, node.PrevColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) case dialect.Gremlin: gremlin := nq.gremlinQuery() query.gremlin = gremlin.InE(node.NextLabel).OutV() @@ -85,15 +87,17 @@ func (nq *NodeQuery) QueryNext() *NodeQuery { query := &NodeQuery{config: nq.config} switch nq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(node.NextColumn), t2.C(node.FieldID)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = node.NextTable + step.Edge.Columns = append(step.Edge.Columns, node.NextColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) case dialect.Gremlin: gremlin := nq.gremlinQuery() query.gremlin = gremlin.OutE(node.NextLabel).InV() diff --git a/entc/integration/ent/pet_query.go b/entc/integration/ent/pet_query.go index 73639584b..c0f46d0b2 100644 --- a/entc/integration/ent/pet_query.go +++ b/entc/integration/ent/pet_query.go @@ -65,15 +65,17 @@ func (pq *PetQuery) QueryTeam() *UserQuery { query := &UserQuery{config: pq.config} switch pq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.TeamColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(pet.TeamColumn)) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = true + step.Edge.Table = pet.TeamTable + step.Edge.Columns = append(step.Edge.Columns, pet.TeamColumn) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) case dialect.Gremlin: gremlin := pq.gremlinQuery() query.gremlin = gremlin.InE(user.TeamLabel).OutV() @@ -86,15 +88,17 @@ func (pq *PetQuery) QueryOwner() *UserQuery { query := &UserQuery{config: pq.config} switch pq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(pet.OwnerColumn)) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = pet.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, pet.OwnerColumn) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) case dialect.Gremlin: gremlin := pq.gremlinQuery() query.gremlin = gremlin.InE(user.PetsLabel).OutV() diff --git a/entc/integration/ent/user_query.go b/entc/integration/ent/user_query.go index 880637eae..66b00bf61 100644 --- a/entc/integration/ent/user_query.go +++ b/entc/integration/ent/user_query.go @@ -68,15 +68,17 @@ func (uq *UserQuery) QueryCard() *CardQuery { query := &CardQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(card.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.CardColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = card.Table + step.To.Column = card.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.CardTable + step.Edge.Columns = append(step.Edge.Columns, user.CardColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.CardLabel).InV() @@ -89,15 +91,17 @@ func (uq *UserQuery) QueryPets() *PetQuery { query := &PetQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.PetsColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.PetsTable + step.Edge.Columns = append(step.Edge.Columns, user.PetsColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.PetsLabel).InV() @@ -110,15 +114,17 @@ func (uq *UserQuery) QueryFiles() *FileQuery { query := &FileQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(file.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.FilesColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = file.Table + step.To.Column = file.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.FilesTable + step.Edge.Columns = append(step.Edge.Columns, user.FilesColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.FilesLabel).InV() @@ -131,20 +137,17 @@ func (uq *UserQuery) QueryGroups() *GroupQuery { query := &GroupQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.GroupsTable) - t4 := builder.Select(t3.C(user.GroupsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.GroupsPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(group.FieldID), t4.C(user.GroupsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.GroupsTable + step.Edge.Columns = append(step.Edge.Columns, user.GroupsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.GroupsLabel).InV() @@ -157,20 +160,17 @@ func (uq *UserQuery) QueryFriends() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FriendsTable) - t4 := builder.Select(t3.C(user.FriendsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FriendsPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FriendsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FriendsTable + step.Edge.Columns = append(step.Edge.Columns, user.FriendsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.Both(user.FriendsLabel) @@ -183,20 +183,17 @@ func (uq *UserQuery) QueryFollowers() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowersTable) - t4 := builder.Select(t3.C(user.FollowersPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.FollowersPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowersPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.FollowersTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowersPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.InE(user.FollowingLabel).OutV() @@ -209,20 +206,17 @@ func (uq *UserQuery) QueryFollowing() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowingTable) - t4 := builder.Select(t3.C(user.FollowingPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FollowingPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowingPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FollowingTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowingPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.FollowingLabel).InV() @@ -235,15 +229,17 @@ func (uq *UserQuery) QueryTeam() *PetQuery { query := &PetQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.TeamColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.TeamTable + step.Edge.Columns = append(step.Edge.Columns, user.TeamColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.TeamLabel).InV() @@ -256,15 +252,17 @@ func (uq *UserQuery) QuerySpouse() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.SpouseColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.SpouseTable + step.Edge.Columns = append(step.Edge.Columns, user.SpouseColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.Both(user.SpouseLabel) @@ -277,15 +275,17 @@ func (uq *UserQuery) QueryChildren() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.ChildrenColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = true + step.Edge.Table = user.ChildrenTable + step.Edge.Columns = append(step.Edge.Columns, user.ChildrenColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.InE(user.ParentLabel).OutV() @@ -298,15 +298,17 @@ func (uq *UserQuery) QueryParent() *UserQuery { query := &UserQuery{config: uq.config} switch uq.driver.Dialect() { case dialect.MySQL, dialect.Postgres, dialect.SQLite: - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.ParentColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(user.ParentColumn)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = false + step.Edge.Table = user.ParentTable + step.Edge.Columns = append(step.Edge.Columns, user.ParentColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) case dialect.Gremlin: gremlin := uq.gremlinQuery() query.gremlin = gremlin.OutE(user.ParentLabel).InV() diff --git a/entc/integration/idtype/ent/user_query.go b/entc/integration/idtype/ent/user_query.go index f8b881291..5487d3d58 100644 --- a/entc/integration/idtype/ent/user_query.go +++ b/entc/integration/idtype/ent/user_query.go @@ -56,55 +56,51 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QuerySpouse chains the current query on the spouse edge. func (uq *UserQuery) QuerySpouse() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.SpouseColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.SpouseTable + step.Edge.Columns = append(step.Edge.Columns, user.SpouseColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryFollowers chains the current query on the followers edge. func (uq *UserQuery) QueryFollowers() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowersTable) - t4 := builder.Select(t3.C(user.FollowersPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.FollowersPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowersPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.FollowersTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowersPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryFollowing chains the current query on the following edge. func (uq *UserQuery) QueryFollowing() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowingTable) - t4 := builder.Select(t3.C(user.FollowingPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FollowingPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowingPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FollowingTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowingPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/entc/integration/template/ent/pet_query.go b/entc/integration/template/ent/pet_query.go index 6c22c5640..7648dda82 100644 --- a/entc/integration/template/ent/pet_query.go +++ b/entc/integration/template/ent/pet_query.go @@ -57,15 +57,17 @@ func (pq *PetQuery) Order(o ...Order) *PetQuery { // QueryOwner chains the current query on the owner edge. func (pq *PetQuery) QueryOwner() *UserQuery { query := &UserQuery{config: pq.config} - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(pet.OwnerColumn)) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = pet.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, pet.OwnerColumn) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) return query } diff --git a/entc/integration/template/ent/user_query.go b/entc/integration/template/ent/user_query.go index cbeb176da..f191555b1 100644 --- a/entc/integration/template/ent/user_query.go +++ b/entc/integration/template/ent/user_query.go @@ -57,35 +57,34 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryPets chains the current query on the pets edge. func (uq *UserQuery) QueryPets() *PetQuery { query := &PetQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.PetsColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.PetsTable + step.Edge.Columns = append(step.Edge.Columns, user.PetsColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryFriends chains the current query on the friends edge. func (uq *UserQuery) QueryFriends() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FriendsTable) - t4 := builder.Select(t3.C(user.FriendsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FriendsPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FriendsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FriendsTable + step.Edge.Columns = append(step.Edge.Columns, user.FriendsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/edgeindex/ent/city_query.go b/examples/edgeindex/ent/city_query.go index 57d08ae1e..24e78e4e1 100644 --- a/examples/edgeindex/ent/city_query.go +++ b/examples/edgeindex/ent/city_query.go @@ -57,15 +57,17 @@ func (cq *CityQuery) Order(o ...Order) *CityQuery { // QueryStreets chains the current query on the streets edge. func (cq *CityQuery) QueryStreets() *StreetQuery { query := &StreetQuery{config: cq.config} - - builder := sql.Dialect(cq.driver.Dialect()) - t1 := builder.Table(street.Table) - t2 := cq.sqlQuery() - t2.Select(t2.C(city.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(city.StreetsColumn), t2.C(city.FieldID)) + step := &sql.Step{} + step.From.V = cq.sqlQuery() + step.From.Table = city.Table + step.From.Column = city.FieldID + step.To.Table = street.Table + step.To.Column = street.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = city.StreetsTable + step.Edge.Columns = append(step.Edge.Columns, city.StreetsColumn) + query.sql = sql.SetNeighbors(cq.driver.Dialect(), step) return query } diff --git a/examples/edgeindex/ent/street_query.go b/examples/edgeindex/ent/street_query.go index 523448744..ad562d0ad 100644 --- a/examples/edgeindex/ent/street_query.go +++ b/examples/edgeindex/ent/street_query.go @@ -57,15 +57,17 @@ func (sq *StreetQuery) Order(o ...Order) *StreetQuery { // QueryCity chains the current query on the city edge. func (sq *StreetQuery) QueryCity() *CityQuery { query := &CityQuery{config: sq.config} - - builder := sql.Dialect(sq.driver.Dialect()) - t1 := builder.Table(city.Table) - t2 := sq.sqlQuery() - t2.Select(t2.C(street.CityColumn)) - query.sql = builder.Select(t1.Columns(city.Columns...)...). - From(t1). - Join(t2). - On(t1.C(city.FieldID), t2.C(street.CityColumn)) + step := &sql.Step{} + step.From.V = sq.sqlQuery() + step.From.Table = street.Table + step.From.Column = street.FieldID + step.To.Table = city.Table + step.To.Column = city.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = street.CityTable + step.Edge.Columns = append(step.Edge.Columns, street.CityColumn) + query.sql = sql.SetNeighbors(sq.driver.Dialect(), step) return query } diff --git a/examples/m2m2types/ent/group_query.go b/examples/m2m2types/ent/group_query.go index 953887da2..c4773b57b 100644 --- a/examples/m2m2types/ent/group_query.go +++ b/examples/m2m2types/ent/group_query.go @@ -57,20 +57,17 @@ func (gq *GroupQuery) Order(o ...Order) *GroupQuery { // QueryUsers chains the current query on the users edge. func (gq *GroupQuery) QueryUsers() *UserQuery { query := &UserQuery{config: gq.config} - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - t3 := builder.Table(group.UsersTable) - t4 := builder.Select(t3.C(group.UsersPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(group.UsersPrimaryKey[0]), t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(group.UsersPrimaryKey[1])) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = group.UsersTable + step.Edge.Columns = append(step.Edge.Columns, group.UsersPrimaryKey...) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) return query } diff --git a/examples/m2m2types/ent/user_query.go b/examples/m2m2types/ent/user_query.go index aee6e5844..ed1408e4e 100644 --- a/examples/m2m2types/ent/user_query.go +++ b/examples/m2m2types/ent/user_query.go @@ -57,20 +57,17 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryGroups chains the current query on the groups edge. func (uq *UserQuery) QueryGroups() *GroupQuery { query := &GroupQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.GroupsTable) - t4 := builder.Select(t3.C(user.GroupsPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.GroupsPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(group.FieldID), t4.C(user.GroupsPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.GroupsTable + step.Edge.Columns = append(step.Edge.Columns, user.GroupsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/m2mbidi/ent/user_query.go b/examples/m2mbidi/ent/user_query.go index 1992c955f..8cb04a53d 100644 --- a/examples/m2mbidi/ent/user_query.go +++ b/examples/m2mbidi/ent/user_query.go @@ -56,20 +56,17 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryFriends chains the current query on the friends edge. func (uq *UserQuery) QueryFriends() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FriendsTable) - t4 := builder.Select(t3.C(user.FriendsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FriendsPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FriendsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FriendsTable + step.Edge.Columns = append(step.Edge.Columns, user.FriendsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/m2mrecur/ent/user_query.go b/examples/m2mrecur/ent/user_query.go index 43d14112e..e80fa77e5 100644 --- a/examples/m2mrecur/ent/user_query.go +++ b/examples/m2mrecur/ent/user_query.go @@ -56,40 +56,34 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryFollowers chains the current query on the followers edge. func (uq *UserQuery) QueryFollowers() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowersTable) - t4 := builder.Select(t3.C(user.FollowersPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.FollowersPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowersPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.FollowersTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowersPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryFollowing chains the current query on the following edge. func (uq *UserQuery) QueryFollowing() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FollowingTable) - t4 := builder.Select(t3.C(user.FollowingPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FollowingPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FollowingPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FollowingTable + step.Edge.Columns = append(step.Edge.Columns, user.FollowingPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/o2m2types/ent/pet_query.go b/examples/o2m2types/ent/pet_query.go index fc81b4404..eacb63d35 100644 --- a/examples/o2m2types/ent/pet_query.go +++ b/examples/o2m2types/ent/pet_query.go @@ -57,15 +57,17 @@ func (pq *PetQuery) Order(o ...Order) *PetQuery { // QueryOwner chains the current query on the owner edge. func (pq *PetQuery) QueryOwner() *UserQuery { query := &UserQuery{config: pq.config} - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(pet.OwnerColumn)) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = pet.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, pet.OwnerColumn) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) return query } diff --git a/examples/o2m2types/ent/user_query.go b/examples/o2m2types/ent/user_query.go index 1a7e70e65..2df715baf 100644 --- a/examples/o2m2types/ent/user_query.go +++ b/examples/o2m2types/ent/user_query.go @@ -57,15 +57,17 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryPets chains the current query on the pets edge. func (uq *UserQuery) QueryPets() *PetQuery { query := &PetQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.PetsColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.PetsTable + step.Edge.Columns = append(step.Edge.Columns, user.PetsColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/o2mrecur/ent/node_query.go b/examples/o2mrecur/ent/node_query.go index 611e104c0..9e7ff03da 100644 --- a/examples/o2mrecur/ent/node_query.go +++ b/examples/o2mrecur/ent/node_query.go @@ -56,30 +56,34 @@ func (nq *NodeQuery) Order(o ...Order) *NodeQuery { // QueryParent chains the current query on the parent edge. func (nq *NodeQuery) QueryParent() *NodeQuery { query := &NodeQuery{config: nq.config} - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.ParentColumn)) - query.sql = builder.Select(t1.Columns(node.Columns...)...). - From(t1). - Join(t2). - On(t1.C(node.FieldID), t2.C(node.ParentColumn)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = node.ParentTable + step.Edge.Columns = append(step.Edge.Columns, node.ParentColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) return query } // QueryChildren chains the current query on the children edge. func (nq *NodeQuery) QueryChildren() *NodeQuery { query := &NodeQuery{config: nq.config} - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(node.ChildrenColumn), t2.C(node.FieldID)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = node.ChildrenTable + step.Edge.Columns = append(step.Edge.Columns, node.ChildrenColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) return query } diff --git a/examples/o2o2types/ent/card_query.go b/examples/o2o2types/ent/card_query.go index 1ec86a83e..968fc22ab 100644 --- a/examples/o2o2types/ent/card_query.go +++ b/examples/o2o2types/ent/card_query.go @@ -57,15 +57,17 @@ func (cq *CardQuery) Order(o ...Order) *CardQuery { // QueryOwner chains the current query on the owner edge. func (cq *CardQuery) QueryOwner() *UserQuery { query := &UserQuery{config: cq.config} - - builder := sql.Dialect(cq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := cq.sqlQuery() - t2.Select(t2.C(card.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(card.OwnerColumn)) + step := &sql.Step{} + step.From.V = cq.sqlQuery() + step.From.Table = card.Table + step.From.Column = card.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = true + step.Edge.Table = card.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, card.OwnerColumn) + query.sql = sql.SetNeighbors(cq.driver.Dialect(), step) return query } diff --git a/examples/o2o2types/ent/user_query.go b/examples/o2o2types/ent/user_query.go index 93d99bbe1..bdc1049fe 100644 --- a/examples/o2o2types/ent/user_query.go +++ b/examples/o2o2types/ent/user_query.go @@ -57,15 +57,17 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryCard chains the current query on the card edge. func (uq *UserQuery) QueryCard() *CardQuery { query := &CardQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(card.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.CardColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = card.Table + step.To.Column = card.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.CardTable + step.Edge.Columns = append(step.Edge.Columns, user.CardColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/o2obidi/ent/user_query.go b/examples/o2obidi/ent/user_query.go index 1a63f9adf..a8b687d2d 100644 --- a/examples/o2obidi/ent/user_query.go +++ b/examples/o2obidi/ent/user_query.go @@ -56,15 +56,17 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QuerySpouse chains the current query on the spouse edge. func (uq *UserQuery) QuerySpouse() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.SpouseColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = user.SpouseTable + step.Edge.Columns = append(step.Edge.Columns, user.SpouseColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/o2orecur/ent/node_query.go b/examples/o2orecur/ent/node_query.go index 6c1a2e1e1..23db74fa0 100644 --- a/examples/o2orecur/ent/node_query.go +++ b/examples/o2orecur/ent/node_query.go @@ -56,30 +56,34 @@ func (nq *NodeQuery) Order(o ...Order) *NodeQuery { // QueryPrev chains the current query on the prev edge. func (nq *NodeQuery) QueryPrev() *NodeQuery { query := &NodeQuery{config: nq.config} - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.PrevColumn)) - query.sql = builder.Select(t1.Columns(node.Columns...)...). - From(t1). - Join(t2). - On(t1.C(node.FieldID), t2.C(node.PrevColumn)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = true + step.Edge.Table = node.PrevTable + step.Edge.Columns = append(step.Edge.Columns, node.PrevColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) return query } // QueryNext chains the current query on the next edge. func (nq *NodeQuery) QueryNext() *NodeQuery { query := &NodeQuery{config: nq.config} - - builder := sql.Dialect(nq.driver.Dialect()) - t1 := builder.Table(node.Table) - t2 := nq.sqlQuery() - t2.Select(t2.C(node.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(node.NextColumn), t2.C(node.FieldID)) + step := &sql.Step{} + step.From.V = nq.sqlQuery() + step.From.Table = node.Table + step.From.Column = node.FieldID + step.To.Table = node.Table + step.To.Column = node.FieldID + step.Edge.Rel = sql.O2O + step.Edge.Inverse = false + step.Edge.Table = node.NextTable + step.Edge.Columns = append(step.Edge.Columns, node.NextColumn) + query.sql = sql.SetNeighbors(nq.driver.Dialect(), step) return query } diff --git a/examples/start/ent/car_query.go b/examples/start/ent/car_query.go index d1f28bf6d..a69ba4016 100644 --- a/examples/start/ent/car_query.go +++ b/examples/start/ent/car_query.go @@ -57,15 +57,17 @@ func (cq *CarQuery) Order(o ...Order) *CarQuery { // QueryOwner chains the current query on the owner edge. func (cq *CarQuery) QueryOwner() *UserQuery { query := &UserQuery{config: cq.config} - - builder := sql.Dialect(cq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := cq.sqlQuery() - t2.Select(t2.C(car.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(car.OwnerColumn)) + step := &sql.Step{} + step.From.V = cq.sqlQuery() + step.From.Table = car.Table + step.From.Column = car.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = car.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, car.OwnerColumn) + query.sql = sql.SetNeighbors(cq.driver.Dialect(), step) return query } diff --git a/examples/start/ent/group_query.go b/examples/start/ent/group_query.go index 0ab4348aa..3e94777f3 100644 --- a/examples/start/ent/group_query.go +++ b/examples/start/ent/group_query.go @@ -57,20 +57,17 @@ func (gq *GroupQuery) Order(o ...Order) *GroupQuery { // QueryUsers chains the current query on the users edge. func (gq *GroupQuery) QueryUsers() *UserQuery { query := &UserQuery{config: gq.config} - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - t3 := builder.Table(group.UsersTable) - t4 := builder.Select(t3.C(group.UsersPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(group.UsersPrimaryKey[0]), t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(group.UsersPrimaryKey[1])) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = group.UsersTable + step.Edge.Columns = append(step.Edge.Columns, group.UsersPrimaryKey...) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) return query } diff --git a/examples/start/ent/user_query.go b/examples/start/ent/user_query.go index 989d9751f..534904aec 100644 --- a/examples/start/ent/user_query.go +++ b/examples/start/ent/user_query.go @@ -58,35 +58,34 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryCars chains the current query on the cars edge. func (uq *UserQuery) QueryCars() *CarQuery { query := &CarQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(car.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.CarsColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = car.Table + step.To.Column = car.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.CarsTable + step.Edge.Columns = append(step.Edge.Columns, user.CarsColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryGroups chains the current query on the groups edge. func (uq *UserQuery) QueryGroups() *GroupQuery { query := &GroupQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.GroupsTable) - t4 := builder.Select(t3.C(user.GroupsPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.GroupsPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(group.FieldID), t4.C(user.GroupsPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.GroupsTable + step.Edge.Columns = append(step.Edge.Columns, user.GroupsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } diff --git a/examples/traversal/ent/group_query.go b/examples/traversal/ent/group_query.go index 16e9e117f..9456004fd 100644 --- a/examples/traversal/ent/group_query.go +++ b/examples/traversal/ent/group_query.go @@ -57,35 +57,34 @@ func (gq *GroupQuery) Order(o ...Order) *GroupQuery { // QueryUsers chains the current query on the users edge. func (gq *GroupQuery) QueryUsers() *UserQuery { query := &UserQuery{config: gq.config} - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.FieldID)) - t3 := builder.Table(group.UsersTable) - t4 := builder.Select(t3.C(group.UsersPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(group.UsersPrimaryKey[0]), t2.C(group.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(group.UsersPrimaryKey[1])) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = group.UsersTable + step.Edge.Columns = append(step.Edge.Columns, group.UsersPrimaryKey...) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) return query } // QueryAdmin chains the current query on the admin edge. func (gq *GroupQuery) QueryAdmin() *UserQuery { query := &UserQuery{config: gq.config} - - builder := sql.Dialect(gq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := gq.sqlQuery() - t2.Select(t2.C(group.AdminColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(group.AdminColumn)) + step := &sql.Step{} + step.From.V = gq.sqlQuery() + step.From.Table = group.Table + step.From.Column = group.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = false + step.Edge.Table = group.AdminTable + step.Edge.Columns = append(step.Edge.Columns, group.AdminColumn) + query.sql = sql.SetNeighbors(gq.driver.Dialect(), step) return query } diff --git a/examples/traversal/ent/pet_query.go b/examples/traversal/ent/pet_query.go index 60d37e915..e1c084583 100644 --- a/examples/traversal/ent/pet_query.go +++ b/examples/traversal/ent/pet_query.go @@ -57,35 +57,34 @@ func (pq *PetQuery) Order(o ...Order) *PetQuery { // QueryFriends chains the current query on the friends edge. func (pq *PetQuery) QueryFriends() *PetQuery { query := &PetQuery{config: pq.config} - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.FieldID)) - t3 := builder.Table(pet.FriendsTable) - t4 := builder.Select(t3.C(pet.FriendsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(pet.FriendsPrimaryKey[0]), t2.C(pet.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(pet.FieldID), t4.C(pet.FriendsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = pet.FriendsTable + step.Edge.Columns = append(step.Edge.Columns, pet.FriendsPrimaryKey...) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) return query } // QueryOwner chains the current query on the owner edge. func (pq *PetQuery) QueryOwner() *UserQuery { query := &UserQuery{config: pq.config} - - builder := sql.Dialect(pq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := pq.sqlQuery() - t2.Select(t2.C(pet.OwnerColumn)) - query.sql = builder.Select(t1.Columns(user.Columns...)...). - From(t1). - Join(t2). - On(t1.C(user.FieldID), t2.C(pet.OwnerColumn)) + step := &sql.Step{} + step.From.V = pq.sqlQuery() + step.From.Table = pet.Table + step.From.Column = pet.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2O + step.Edge.Inverse = true + step.Edge.Table = pet.OwnerTable + step.Edge.Columns = append(step.Edge.Columns, pet.OwnerColumn) + query.sql = sql.SetNeighbors(pq.driver.Dialect(), step) return query } diff --git a/examples/traversal/ent/user_query.go b/examples/traversal/ent/user_query.go index 95a30252b..da0410b70 100644 --- a/examples/traversal/ent/user_query.go +++ b/examples/traversal/ent/user_query.go @@ -58,70 +58,68 @@ func (uq *UserQuery) Order(o ...Order) *UserQuery { // QueryPets chains the current query on the pets edge. func (uq *UserQuery) QueryPets() *PetQuery { query := &PetQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(pet.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.PetsColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = pet.Table + step.To.Column = pet.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = false + step.Edge.Table = user.PetsTable + step.Edge.Columns = append(step.Edge.Columns, user.PetsColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryFriends chains the current query on the friends edge. func (uq *UserQuery) QueryFriends() *UserQuery { query := &UserQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(user.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.FriendsTable) - t4 := builder.Select(t3.C(user.FriendsPrimaryKey[1])). - From(t3). - Join(t2). - On(t3.C(user.FriendsPrimaryKey[0]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(user.FieldID), t4.C(user.FriendsPrimaryKey[1])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = user.Table + step.To.Column = user.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = false + step.Edge.Table = user.FriendsTable + step.Edge.Columns = append(step.Edge.Columns, user.FriendsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryGroups chains the current query on the groups edge. func (uq *UserQuery) QueryGroups() *GroupQuery { query := &GroupQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - t3 := builder.Table(user.GroupsTable) - t4 := builder.Select(t3.C(user.GroupsPrimaryKey[0])). - From(t3). - Join(t2). - On(t3.C(user.GroupsPrimaryKey[1]), t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t4). - On(t1.C(group.FieldID), t4.C(user.GroupsPrimaryKey[0])) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.M2M + step.Edge.Inverse = true + step.Edge.Table = user.GroupsTable + step.Edge.Columns = append(step.Edge.Columns, user.GroupsPrimaryKey...) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query } // QueryManage chains the current query on the manage edge. func (uq *UserQuery) QueryManage() *GroupQuery { query := &GroupQuery{config: uq.config} - - builder := sql.Dialect(uq.driver.Dialect()) - t1 := builder.Table(group.Table) - t2 := uq.sqlQuery() - t2.Select(t2.C(user.FieldID)) - query.sql = builder.Select(). - From(t1). - Join(t2). - On(t1.C(user.ManageColumn), t2.C(user.FieldID)) + step := &sql.Step{} + step.From.V = uq.sqlQuery() + step.From.Table = user.Table + step.From.Column = user.FieldID + step.To.Table = group.Table + step.To.Column = group.FieldID + step.Edge.Rel = sql.O2M + step.Edge.Inverse = true + step.Edge.Table = user.ManageTable + step.Edge.Columns = append(step.Edge.Columns, user.ManageColumn) + query.sql = sql.SetNeighbors(uq.driver.Dialect(), step) return query }