This commit is contained in:
parent
0bc51062de
commit
9cefa09718
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"intent-system/pkg/dal/models"
|
"intent-system/pkg/dal/models"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/civet148/log"
|
"github.com/civet148/log"
|
||||||
"github.com/civet148/sqlca/v2"
|
"github.com/civet148/sqlca/v2"
|
||||||
|
|
@ -400,8 +401,57 @@ func (dao *NewsDAO) QueryAsync(cond *NewsAsyncCondition) (dos []*models.NewsDO,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 一次 SQL 抓取该批 org_id,对比 digest,返回需要下发的记录
|
// 一次 SQL 抓取该批 org_id,对比 digest,返回需要下发的记录
|
||||||
func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) {
|
// func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) {
|
||||||
|
|
||||||
|
// if len(pairs) == 0 {
|
||||||
|
// return []*models.NewsDO{}, 0, nil
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // ① 提取 org_id 列表,同时建映射表 clientDigest[org_id] = digest
|
||||||
|
// orgIDs := make([]int64, 0, len(pairs))
|
||||||
|
// clientDigest := make(map[int64]string, len(pairs))
|
||||||
|
// for _, p := range pairs {
|
||||||
|
// orgIDs = append(orgIDs, p.OrgId)
|
||||||
|
// clientDigest[p.OrgId] = p.Digest
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // ② 一次 SQL:SELECT * FROM news WHERE org_id IN ( … )
|
||||||
|
// var rows []*models.NewsDO
|
||||||
|
// // 显式展开 orgIDs
|
||||||
|
// idArgs := make([]interface{}, 0, len(orgIDs))
|
||||||
|
// for _, id := range orgIDs {
|
||||||
|
// idArgs = append(idArgs, id)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// _, err = dao.db.
|
||||||
|
// Model(&rows).
|
||||||
|
// Table(models.TableNameNews).
|
||||||
|
// Where("org_id IN (?)", idArgs...). // 显式展开
|
||||||
|
// Query()
|
||||||
|
// if err != nil {
|
||||||
|
// return nil, 0, err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // ③ 在 Go 层比对 digest
|
||||||
|
// for _, row := range rows {
|
||||||
|
// cDigest := clientDigest[row.OrgId] // 客户端传来的 digest
|
||||||
|
|
||||||
|
// // 直接从 map[string]interface{} 里取
|
||||||
|
// var sDigest string
|
||||||
|
// if d, ok := row.ExtraData["digest"].(string); ok {
|
||||||
|
// sDigest = d
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // cDigest 为空 或 与服务器端不同,都需要下发
|
||||||
|
// if cDigest == "" || cDigest != sDigest {
|
||||||
|
// dos = append(dos, row)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return dos, int64(len(dos)), nil
|
||||||
|
// }
|
||||||
|
|
||||||
|
func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) {
|
||||||
if len(pairs) == 0 {
|
if len(pairs) == 0 {
|
||||||
return []*models.NewsDO{}, 0, nil
|
return []*models.NewsDO{}, 0, nil
|
||||||
}
|
}
|
||||||
|
|
@ -414,34 +464,30 @@ func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO
|
||||||
clientDigest[p.OrgId] = p.Digest
|
clientDigest[p.OrgId] = p.Digest
|
||||||
}
|
}
|
||||||
|
|
||||||
// ② 一次 SQL:SELECT * FROM news WHERE org_id IN ( … )
|
// ② 构造 IN (1,2,3...) 的 SQL
|
||||||
var rows []*models.NewsDO
|
placeholders := make([]string, 0, len(orgIDs))
|
||||||
// 显式展开 orgIDs
|
|
||||||
idArgs := make([]interface{}, 0, len(orgIDs))
|
|
||||||
for _, id := range orgIDs {
|
for _, id := range orgIDs {
|
||||||
idArgs = append(idArgs, id)
|
placeholders = append(placeholders, fmt.Sprintf("%d", id))
|
||||||
}
|
}
|
||||||
|
inClause := fmt.Sprintf("org_id IN (%s)", strings.Join(placeholders, ","))
|
||||||
|
|
||||||
|
var rows []*models.NewsDO
|
||||||
_, err = dao.db.
|
_, err = dao.db.
|
||||||
Model(&rows).
|
Model(&rows).
|
||||||
Table(models.TableNameNews).
|
Table(models.TableNameNews).
|
||||||
Where("org_id IN (?)", idArgs...). // 显式展开
|
Where(inClause).
|
||||||
Query()
|
Query()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, err
|
return nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// ③ 在 Go 层比对 digest
|
// ③ Go 层比对 digest
|
||||||
for _, row := range rows {
|
for _, row := range rows {
|
||||||
cDigest := clientDigest[row.OrgId] // 客户端传来的 digest
|
cDigest := clientDigest[row.OrgId]
|
||||||
|
|
||||||
// 直接从 map[string]interface{} 里取
|
|
||||||
var sDigest string
|
var sDigest string
|
||||||
if d, ok := row.ExtraData["digest"].(string); ok {
|
if d, ok := row.ExtraData["digest"].(string); ok {
|
||||||
sDigest = d
|
sDigest = d
|
||||||
}
|
}
|
||||||
|
|
||||||
// cDigest 为空 或 与服务器端不同,都需要下发
|
|
||||||
if cDigest == "" || cDigest != sDigest {
|
if cDigest == "" || cDigest != sDigest {
|
||||||
dos = append(dos, row)
|
dos = append(dos, row)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue