Commit 95c65de9 authored by slene's avatar slene

fix #440

parent ef79a2b4
...@@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) { ...@@ -112,7 +112,7 @@ func (t *dbTables) parseRelated(rels []string, depth int) {
names = append(names, fi.name) names = append(names, fi.name)
mmi = fi.relModelInfo mmi = fi.relModelInfo
if fi.null { if fi.null || t.skipEnd {
inner = false inner = false
} }
...@@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) { ...@@ -189,6 +189,8 @@ func (t *dbTables) getJoinSql() (join string) {
func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) { func (t *dbTables) parseExprs(mi *modelInfo, exprs []string) (index, name string, info *fieldInfo, success bool) {
var ( var (
jtl *dbTable jtl *dbTable
fi *fieldInfo
fiN *fieldInfo
mmi = mi mmi = mi
) )
...@@ -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
inner := true inner := true
loopFor:
for i, ex := range exprs { for i, ex := range exprs {
fi, ok := mmi.fields.GetByAny(ex) var ok, okN bool
if fiN != nil {
fi = fiN
ok = true
fiN = nil
}
if i == 0 {
fi, ok = mmi.fields.GetByAny(ex)
}
// fmt.Println(ex, fi.name, fiN)
_ = okN
if ok { if ok {
...@@ -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
mmi = fi.reverseFieldInfo.mi mmi = fi.reverseFieldInfo.mi
} }
if i < num {
fiN, okN = mmi.fields.GetByAny(exprs[i+1])
}
if isRel && (fi.mi.isThrough == false || num != i) { if isRel && (fi.mi.isThrough == false || num != i) {
if fi.null { if fi.null || t.skipEnd {
inner = false inner = false
} }
if num == i && t.skipEnd { if t.skipEnd && okN || !t.skipEnd {
} else { if t.skipEnd && okN && fiN.pk {
goto loopEnd
}
jt, _ := t.add(names, mmi, fi, inner) jt, _ := t.add(names, mmi, fi, inner)
jt.jtl = jtl jt.jtl = jtl
jtl = jt 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
} }
if num == i { if num != i {
if i == 0 || jtl == nil { continue
index = "T0" }
} else {
index = jtl.index
}
info = fi loopEnd:
if jtl == nil { if i == 0 || jtl == nil {
name = fi.name index = "T0"
} else { } else {
name = jtl.name + ExprSep + fi.name index = jtl.index
} }
switch { info = fi
case fi.rel:
case fi.reverse: if jtl == nil {
switch fi.reverseFieldInfo.fieldType { name = fi.name
case RelOneToOne, RelForeignKey: } else {
index = jtl.index name = jtl.name + ExprSep + fi.name
info = fi.reverseFieldInfo.mi.fields.pk }
name = info.name
} switch {
case fi.rel:
case fi.reverse:
switch fi.reverseFieldInfo.fieldType {
case RelOneToOne, RelForeignKey:
index = jtl.index
info = fi.reverseFieldInfo.mi.fields.pk
name = info.name
} }
} }
break loopFor
} else { } else {
index = "" index = ""
name = "" name = ""
......
...@@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) { ...@@ -1561,6 +1561,32 @@ func TestDelete(t *testing.T) {
num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count() num, err = qs.Filter("user_name", "slene").Filter("profile__isnull", true).Count()
throwFail(t, err) throwFail(t, err)
throwFail(t, AssertIs(num, 1)) throwFail(t, AssertIs(num, 1))
qs = dORM.QueryTable("comment")
num, err = qs.Count()
throwFail(t, err)
throwFail(t, AssertIs(num, 6))
qs = dORM.QueryTable("post")
num, err = qs.Filter("Id", 3).Delete()
throwFail(t, err)
throwFail(t, AssertIs(num, 1))
qs = dORM.QueryTable("comment")
num, err = qs.Count()
throwFail(t, err)
throwFail(t, AssertIs(num, 4))
fmt.Println("...")
qs = dORM.QueryTable("comment")
num, err = qs.Filter("Post__User", 3).Delete()
throwFail(t, err)
throwFail(t, AssertIs(num, 3))
qs = dORM.QueryTable("comment")
num, err = qs.Count()
throwFail(t, err)
throwFail(t, AssertIs(num, 1))
} }
func TestTransaction(t *testing.T) { func TestTransaction(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment