Skip to content

Commit fb8e23a

Browse files
committed
fix: database query condition issue
1 parent a7d0eee commit fb8e23a

File tree

2 files changed

+105
-46
lines changed

2 files changed

+105
-46
lines changed

backend/domain/memory/database/service/database_impl.go

Lines changed: 70 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,8 +1208,10 @@ func (d databaseService) executeSelectSQL(ctx context.Context, req *ExecuteSQLRe
12081208
}
12091209
selectReq.Fields = fields
12101210
}
1211-
1212-
var complexCond *rdb.ComplexCondition
1211+
var (
1212+
finallyComplexCond *rdb.ComplexCondition
1213+
complexCond *rdb.ComplexCondition
1214+
)
12131215
var err error
12141216
if req.Condition != nil {
12151217
complexCond, err = convertCondition(ctx, req.Condition, fieldNameToPhysical, req.SQLParams)
@@ -1219,24 +1221,32 @@ func (d databaseService) executeSelectSQL(ctx context.Context, req *ExecuteSQLRe
12191221
}
12201222

12211223
// add rw mode
1224+
var extraCondition *rdb.ComplexCondition
12221225
if tableInfo.RwMode == table.BotTableRWMode_LimitedReadWrite && req.UserID != "" {
12231226
cond := &rdb.Condition{
12241227
Field: database.DefaultUidColName,
12251228
Operator: entity3.OperatorEqual,
12261229
Value: req.UserID,
12271230
}
1231+
extraCondition = &rdb.ComplexCondition{
1232+
Conditions: []*rdb.Condition{cond},
1233+
}
1234+
}
12281235

1229-
if complexCond == nil {
1230-
complexCond = &rdb.ComplexCondition{
1231-
Conditions: []*rdb.Condition{cond},
1232-
}
1233-
} else {
1234-
complexCond.Conditions = append(complexCond.Conditions, cond)
1236+
if extraCondition != nil {
1237+
finallyComplexCond = &rdb.ComplexCondition{
1238+
NestedConditions: []*rdb.ComplexCondition{
1239+
complexCond,
1240+
extraCondition,
1241+
},
1242+
Operator: entity3.AND,
12351243
}
1244+
} else {
1245+
finallyComplexCond = complexCond
12361246
}
12371247

1238-
if complexCond != nil {
1239-
selectReq.Where = complexCond
1248+
if finallyComplexCond != nil {
1249+
selectReq.Where = finallyComplexCond
12401250
}
12411251

12421252
if len(req.OrderByList) > 0 {
@@ -1377,32 +1387,47 @@ func (d databaseService) executeUpdateSQL(ctx context.Context, req *ExecuteSQLRe
13771387
}
13781388

13791389
condParams := req.SQLParams[index:]
1380-
complexCond, err := convertCondition(ctx, req.Condition, fieldNameToPhysical, condParams)
1381-
if err != nil {
1382-
return -1, fmt.Errorf("convert condition failed: %v", err)
1390+
var (
1391+
finallyComplexCond *rdb.ComplexCondition
1392+
complexCond *rdb.ComplexCondition
1393+
)
1394+
var err error
1395+
if req.Condition != nil {
1396+
complexCond, err = convertCondition(ctx, req.Condition, fieldNameToPhysical, condParams)
1397+
if err != nil {
1398+
return -1, fmt.Errorf("convert condition failed: %v", err)
1399+
}
13831400
}
13841401

13851402
// add rw mode
1403+
var extraCondition *rdb.ComplexCondition
13861404
if tableInfo.RwMode == table.BotTableRWMode_LimitedReadWrite && req.UserID != "" {
13871405
cond := &rdb.Condition{
13881406
Field: database.DefaultUidColName,
13891407
Operator: entity3.OperatorEqual,
13901408
Value: req.UserID,
13911409
}
1410+
extraCondition = &rdb.ComplexCondition{
1411+
Conditions: []*rdb.Condition{cond},
1412+
}
1413+
}
13921414

1393-
if complexCond == nil {
1394-
complexCond = &rdb.ComplexCondition{
1395-
Conditions: []*rdb.Condition{cond},
1396-
}
1397-
} else {
1398-
complexCond.Conditions = append(complexCond.Conditions, cond)
1415+
if extraCondition != nil {
1416+
finallyComplexCond = &rdb.ComplexCondition{
1417+
NestedConditions: []*rdb.ComplexCondition{
1418+
complexCond,
1419+
extraCondition,
1420+
},
1421+
Operator: entity3.AND,
13991422
}
1423+
} else {
1424+
finallyComplexCond = complexCond
14001425
}
14011426

14021427
updateResp, err := d.rdb.UpdateData(ctx, &rdb.UpdateDataRequest{
14031428
TableName: physicalTableName,
14041429
Data: updateData,
1405-
Where: complexCond,
1430+
Where: finallyComplexCond,
14061431
Limit: int64PtrToIntPtr(req.Limit),
14071432
})
14081433
if err != nil {
@@ -1417,31 +1442,46 @@ func (d databaseService) executeDeleteSQL(ctx context.Context, req *ExecuteSQLRe
14171442
return -1, fmt.Errorf("missing delete condition")
14181443
}
14191444

1420-
complexCond, err := convertCondition(ctx, req.Condition, fieldNameToPhysical, req.SQLParams)
1421-
if err != nil {
1422-
return -1, fmt.Errorf("convert condition failed: %v", err)
1445+
var (
1446+
finallyComplexCond *rdb.ComplexCondition
1447+
complexCond *rdb.ComplexCondition
1448+
)
1449+
var err error
1450+
if req.Condition != nil {
1451+
complexCond, err = convertCondition(ctx, req.Condition, fieldNameToPhysical, req.SQLParams)
1452+
if err != nil {
1453+
return -1, fmt.Errorf("convert condition failed: %v", err)
1454+
}
14231455
}
14241456

14251457
// add rw mode
1458+
var extraCondition *rdb.ComplexCondition
14261459
if tableInfo.RwMode == table.BotTableRWMode_LimitedReadWrite && req.UserID != "" {
14271460
cond := &rdb.Condition{
14281461
Field: database.DefaultUidColName,
14291462
Operator: entity3.OperatorEqual,
14301463
Value: req.UserID,
14311464
}
1465+
extraCondition = &rdb.ComplexCondition{
1466+
Conditions: []*rdb.Condition{cond},
1467+
}
1468+
}
14321469

1433-
if complexCond == nil {
1434-
complexCond = &rdb.ComplexCondition{
1435-
Conditions: []*rdb.Condition{cond},
1436-
}
1437-
} else {
1438-
complexCond.Conditions = append(complexCond.Conditions, cond)
1470+
if extraCondition != nil {
1471+
finallyComplexCond = &rdb.ComplexCondition{
1472+
NestedConditions: []*rdb.ComplexCondition{
1473+
complexCond,
1474+
extraCondition,
1475+
},
1476+
Operator: entity3.AND,
14391477
}
1478+
} else {
1479+
finallyComplexCond = complexCond
14401480
}
14411481

14421482
deleteResp, err := d.rdb.DeleteData(ctx, &rdb.DeleteDataRequest{
14431483
TableName: physicalTableName,
1444-
Where: complexCond,
1484+
Where: finallyComplexCond,
14451485
Limit: int64PtrToIntPtr(req.Limit),
14461486
})
14471487
if err != nil {

backend/infra/impl/rdb/mysql.go

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -930,14 +930,23 @@ func (m *mysqlService) buildWhereClause(condition *rdb.ComplexCondition) (string
930930
if condition == nil {
931931
return "", nil, nil
932932
}
933-
934933
if condition.Operator == "" {
935934
condition.Operator = entity2.AND
936935
}
936+
if len(condition.NestedConditions) > 0 {
937+
return m.buildNestedConditions(condition)
938+
} else if len(condition.Conditions) > 0 {
939+
whereClauseString, values, err := m.buildWhereCondition(condition)
940+
return " WHERE " + whereClauseString, values, err
941+
} else {
942+
return "", nil, fmt.Errorf("empty condition: no nested or direct conditions found")
943+
}
944+
945+
}
937946

947+
func (m *mysqlService) buildWhereCondition(condition *rdb.ComplexCondition) (string, []interface{}, error) {
938948
var whereClause strings.Builder
939949
values := make([]interface{}, 0)
940-
941950
for i, cond := range condition.Conditions {
942951
if i > 0 {
943952
whereClause.WriteString(fmt.Sprintf(" %s ", condition.Operator))
@@ -971,25 +980,35 @@ func (m *mysqlService) buildWhereClause(condition *rdb.ComplexCondition) (string
971980
values = append(values, cond.Value)
972981
}
973982
}
983+
if whereClause.Len() > 0 {
984+
return whereClause.String(), values, nil
985+
}
986+
return "", values, nil
987+
}
974988

975-
if len(condition.NestedConditions) > 0 {
976-
whereClause.WriteString(" AND (")
977-
for i, nested := range condition.NestedConditions {
978-
if i > 0 {
979-
whereClause.WriteString(fmt.Sprintf(" %s ", nested.Operator))
980-
}
981-
nestedClause, nestedValues, err := m.buildWhereClause(nested)
982-
if err != nil {
983-
return "", nil, err
984-
}
985-
whereClause.WriteString(nestedClause)
986-
values = append(values, nestedValues...)
989+
func (m *mysqlService) buildNestedConditions(condition *rdb.ComplexCondition) (string, []interface{}, error) {
990+
var whereClause strings.Builder
991+
values := make([]interface{}, 0)
992+
993+
whereClause.WriteString(" WHERE (")
994+
for i, nested := range condition.NestedConditions {
995+
if i > 0 {
996+
whereClause.WriteString(fmt.Sprintf(" %s ", nested.Operator))
997+
}
998+
nestedClause, nestedValues, err := m.buildWhereCondition(nested)
999+
if err != nil {
1000+
return "", nil, err
1001+
}
1002+
whereClause.WriteString(nestedClause)
1003+
if i < len(condition.NestedConditions)-1 {
1004+
whereClause.WriteString(" " + string(condition.Operator))
9871005
}
988-
whereClause.WriteString(")")
1006+
values = append(values, nestedValues...)
9891007
}
1008+
whereClause.WriteString(")")
9901009

9911010
if whereClause.Len() > 0 {
992-
return " WHERE " + whereClause.String(), values, nil
1011+
return whereClause.String(), values, nil
9931012
}
9941013
return "", values, nil
9951014
}

0 commit comments

Comments
 (0)