fix #440
Showing
2 changed files
with
82 additions
and
26 deletions
| ... | @@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) { | ... | @@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) { |
| 112 | names = append(names, fi.name) | 112 | names = append(names, fi.name) |
| 113 | mmi = fi.relModelInfo | 113 | mmi = fi.relModelInfo |
| 114 | 114 | ||
| 115 | if fi.null { | 115 | if fi.null || t.skipEnd { |
| 116 | inner = false | 116 | inner = false |
| 117 | } | 117 | } |
| 118 | 118 | ||
| ... | @@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) { | ... | @@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) { |
| 189 | func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) { | 189 | func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) { |
| 190 | var ( | 190 | var ( |
| 191 | jtl *dbTable | 191 | jtl *dbTable |
| 192 | fi *fieldInfo | ||
| 193 | fiN *fieldInfo | ||
| 192 | mmi = mi | 194 | mmi = mi |
| 193 | ) | 195 | ) |
| 194 | 196 | ||
| ... | @@ -197,9 +199,24 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string | ... | @@ -197,9 +199,24 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string |
| 197 | 199 | ||
| 198 | inner := true | 200 | inner := true |
| 199 | 201 | ||
| 202 | loopFor: | ||
| 200 | for i, ex := range exprs { | 203 | for i, ex := range exprs { |
| 201 | 204 | ||
| 202 | fi, ok := mmi.fields.GetByAny(ex) | 205 | var ok, okN bool |
| 206 | |||
| 207 | if fiN != nil { | ||
| 208 | fi = fiN | ||
| 209 | ok = true | ||
| 210 | fiN = nil | ||
| 211 | } | ||
| 212 | |||
| 213 | if i == 0 { | ||
| 214 | fi, ok = mmi.fields.GetByAny(ex) | ||
| 215 | } | ||
| 216 | |||
| 217 | // fmt.Println(ex, fi.name, fiN) | ||
| 218 | |||
| 219 | _ = okN | ||
| 203 | 220 | ||
| 204 | if ok { | 221 | if ok { |
| 205 | 222 | ||
| ... | @@ -217,13 +234,20 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string | ... | @@ -217,13 +234,20 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string |
| 217 | mmi = fi.reverseFieldInfo.mi | 234 | mmi = fi.reverseFieldInfo.mi |
| 218 | } | 235 | } |
| 219 | 236 | ||
| 237 | if i < num { | ||
| 238 | fiN, okN = mmi.fields.GetByAny(exprs[i+1]) | ||
| 239 | } | ||
| 240 | |||
| 220 | if isRel && (fi.mi.isThrough == false || num != i) { | 241 | if isRel && (fi.mi.isThrough == false || num != i) { |
| 221 | if fi.null { | 242 | if fi.null || t.skipEnd { |
| 222 | inner = false | 243 | inner = false |
| 223 | } | 244 | } |
| 224 | 245 | ||
| 225 | if num == i && t.skipEnd { | 246 | if t.skipEnd && okN || !t.skipEnd { |
| 226 | } else { | 247 | if t.skipEnd && okN && fiN.pk { |
| 248 | goto loopEnd | ||
| 249 | } | ||
| 250 | |||
| 227 | jt, _ := t.add(names, mmi, fi, inner) | 251 | jt, _ := t.add(names, mmi, fi, inner) |
| 228 | jt.jtl = jtl | 252 | jt.jtl = jtl |
| 229 | jtl = jt | 253 | jtl = jt |
| ... | @@ -231,34 +255,40 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string | ... | @@ -231,34 +255,40 @@ func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string |
| 231 | 255 | ||
| 232 | } | 256 | } |
| 233 | 257 | ||
| 234 | if num == i { | 258 | if num != i { |
| 235 | if i == 0 || jtl == nil { | 259 | continue |
| 236 | index = "T0" | 260 | } |
| 237 | } else { | ||
| 238 | index = jtl.index | ||
| 239 | } | ||
| 240 | 261 | ||
| 241 | info = fi | 262 | loopEnd: |
| 242 | 263 | ||
| 243 | if jtl == nil { | 264 | if i == 0 || jtl == nil { |
| 244 | name = fi.name | 265 | index = "T0" |
| 245 | } else { | 266 | } else { |
| 246 | name = jtl.name + ExprSep + fi.name | 267 | index = jtl.index |
| 247 | } | 268 | } |
| 248 | 269 | ||
| 249 | switch { | 270 | info = fi |
| 250 | case fi.rel: | ||
| 251 | 271 | ||
| 252 | case fi.reverse: | 272 | if jtl == nil { |
| 253 | switch fi.reverseFieldInfo.fieldType { | 273 | name = fi.name |
| 254 | case RelOneToOne, RelForeignKey: | 274 | } else { |
| 255 | index = jtl.index | 275 | name = jtl.name + ExprSep + fi.name |
| 256 | info = fi.reverseFieldInfo.mi.fields.pk | 276 | } |
| 257 | name = info.name | 277 | |
| 258 | } | 278 | switch { |
| 279 | case fi.rel: | ||
| 280 | |||
| 281 | case fi.reverse: | ||
| 282 | switch fi.reverseFieldInfo.fieldType { | ||
| 283 | case RelOneToOne, RelForeignKey: | ||
| 284 | index = jtl.index | ||
| 285 | info = fi.reverseFieldInfo.mi.fields.pk | ||
| 286 | name = info.name | ||
| 259 | } | 287 | } |
| 260 | } | 288 | } |
| 261 | 289 | ||
| 290 | break loopFor | ||
| 291 | |||
| 262 | } else { | 292 | } else { |
| 263 | index = "" | 293 | index = "" |
| 264 | name = "" | 294 | name = "" | ... | ... |
| ... | @@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) { | ... | @@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) { |
| 1561 | num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count() | 1561 | num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count() |
| 1562 | throwFail(t, err) | 1562 | throwFail(t, err) |
| 1563 | throwFail(t, AssertIs(num, 1)) | 1563 | throwFail(t, AssertIs(num, 1)) |
| 1564 | |||
| 1565 | qs = dORM.QueryTable("comment") | ||
| 1566 | num, err = qs.Count() | ||
| 1567 | throwFail(t, err) | ||
| 1568 | throwFail(t, AssertIs(num, 6)) | ||
| 1569 | |||
| 1570 | qs = dORM.QueryTable("post") | ||
| 1571 | num, err = qs.Filter("Id", 3).Delete() | ||
| 1572 | throwFail(t, err) | ||
| 1573 | throwFail(t, AssertIs(num, 1)) | ||
| 1574 | |||
| 1575 | qs = dORM.QueryTable("comment") | ||
| 1576 | num, err = qs.Count() | ||
| 1577 | throwFail(t, err) | ||
| 1578 | throwFail(t, AssertIs(num, 4)) | ||
| 1579 | |||
| 1580 | fmt.Println("...") | ||
| 1581 | qs = dORM.QueryTable("comment") | ||
| 1582 | num, err = qs.Filter("Post__User", 3).Delete() | ||
| 1583 | throwFail(t, err) | ||
| 1584 | throwFail(t, AssertIs(num, 3)) | ||
| 1585 | |||
| 1586 | qs = dORM.QueryTable("comment") | ||
| 1587 | num, err = qs.Count() | ||
| 1588 | throwFail(t, err) | ||
| 1589 | throwFail(t, AssertIs(num, 1)) | ||
| 1564 | } | 1590 | } |
| 1565 | 1591 | ||
| 1566 | func TestTransaction(t *testing.T) { | 1592 | func TestTransaction(t *testing.T) { | ... | ... |
-
Please register or sign in to post a comment