Skip to content

Commit 6431b56

Browse files
feat: add more apis for batch query (#14)
1 parent 39cdae4 commit 6431b56

26 files changed

+2624
-12
lines changed

dao/item.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ type ItemDao interface {
2424
GetByGroupId(context context.Context, groupId int64, includeAll bool) (database.Item, error)
2525
GetByBucketId(context context.Context, bucketId int64, includeAll bool) (database.Item, error)
2626
GetByObjectId(context context.Context, objectId int64, includeAll bool) (database.Item, error)
27+
GetByBucketIds(context context.Context, bucketIds []int64, includeAll bool) ([]database.Item, error)
28+
GetByObjectIds(context context.Context, objectIds []int64, includeAll bool) ([]database.Item, error)
2729
Batch(context context.Context, ids []int64, includeAll bool) ([]database.Item, error)
2830
Search(context context.Context, categoryId int64, address, keyword string, includeAll bool, sort string, offset, limit int) (int64, []*database.Item, error)
2931
}
@@ -130,6 +132,36 @@ func (dao *dbItemDao) GetByObjectId(context context.Context, objectId int64, inc
130132
return item, nil
131133
}
132134

135+
func (dao *dbItemDao) GetByBucketIds(context context.Context, bucketIds []int64, includeAll bool) ([]database.Item, error) {
136+
items := make([]database.Item, 0)
137+
if includeAll {
138+
if err := dao.db.Preload("Stats").Where("resource_id in ? and type = ?", bucketIds, database.COLLECTION).Find(&items).Error; err != nil {
139+
return items, err
140+
}
141+
} else {
142+
if err := dao.db.Preload("Stats").Where("resource_id in ? and type = ? and status <> ? and status <> ? and status <> ?",
143+
bucketIds, database.COLLECTION, database.ItemBlocked, database.ItemDelisted, database.ItemPending).Find(&items).Error; err != nil {
144+
return items, err
145+
}
146+
}
147+
return items, nil
148+
}
149+
150+
func (dao *dbItemDao) GetByObjectIds(context context.Context, objectIds []int64, includeAll bool) ([]database.Item, error) {
151+
items := make([]database.Item, 0)
152+
if includeAll {
153+
if err := dao.db.Preload("Stats").Where("resource_id in ? and type = ?", objectIds, database.OBJECT).Find(&items).Error; err != nil {
154+
return items, err
155+
}
156+
} else {
157+
if err := dao.db.Preload("Stats").Where("resource_id in ? and type = ? and status <> ? and status <> ? and status <> ?",
158+
objectIds, database.OBJECT, database.ItemBlocked, database.ItemDelisted, database.ItemPending).Find(&items).Error; err != nil {
159+
return items, err
160+
}
161+
}
162+
return items, nil
163+
}
164+
133165
func (dao *dbItemDao) Batch(context context.Context, ids []int64, includeAll bool) ([]database.Item, error) {
134166
items := make([]database.Item, 0)
135167
if includeAll {

dao/purchase.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type PurchaseDao interface {
2020
Update(context context.Context, purchase *database.Purchase) error
2121
Get(context context.Context, id int64) (database.Purchase, error)
2222
Search(context context.Context, itemId int64, address string, sort string, offset, limit int) (int64, []*database.Purchase, error)
23+
Query(context context.Context, itemIds []int64, bucketIds []int64, objectIds []int64, address string, sort string, offset, limit int) (int64, []*database.Purchase, error)
2324
}
2425

2526
type dbPurchaseDao struct {
@@ -122,3 +123,78 @@ func (dao *dbPurchaseDao) Search(context context.Context, itemId int64, address
122123

123124
return
124125
}
126+
127+
func (dao *dbPurchaseDao) Query(context context.Context, itemIds []int64, bucketIds []int64, objectIds []int64, address string, sort string, offset, limit int) (total int64, purchases []*database.Purchase, err error) {
128+
rawSql := fmt.Sprintf(" inner join items i on p.item_id = i.id where i.status = %d", database.ItemListed)
129+
parameters := make([]interface{}, 0)
130+
131+
if len(itemIds) > 0 {
132+
rawSql = rawSql + ` and item_id in ?`
133+
parameters = append(parameters, itemIds)
134+
} else if len(bucketIds) > 0 {
135+
rawSql = rawSql + ` and resource_id in ? and type = ?`
136+
parameters = append(parameters, bucketIds)
137+
parameters = append(parameters, database.COLLECTION)
138+
} else if len(objectIds) > 0 {
139+
rawSql = rawSql + ` and resource_id in ? and type = ?`
140+
parameters = append(parameters, objectIds)
141+
parameters = append(parameters, database.OBJECT)
142+
}
143+
144+
if len(address) > 0 {
145+
rawSql = rawSql + ` and buyer_address = ?`
146+
parameters = append(parameters, address)
147+
}
148+
149+
countSql := "select count(1) from purchases p " + rawSql
150+
151+
err = dao.db.Raw(countSql, parameters...).Scan(&total).Error
152+
if err != nil {
153+
return 0, nil, err
154+
}
155+
if total == 0 {
156+
return
157+
}
158+
159+
dataSql := "select * from purchases p " + rawSql
160+
dataSql = dataSql + " order by "
161+
switch sort {
162+
case PurchaseSortCreationAsc:
163+
dataSql = dataSql + "p.id asc "
164+
case PurchaseSortCreationDesc:
165+
dataSql = dataSql + "p.id desc "
166+
case PurchaseSortPriceAsc:
167+
dataSql = dataSql + "p.price asc "
168+
case PurchaseSortPriceDesc:
169+
dataSql = dataSql + "p.price desc "
170+
default:
171+
return 0, nil, fmt.Errorf("unsupported sort string: %s", sort)
172+
}
173+
dataSql = dataSql + fmt.Sprintf("limit %d, %d", offset, limit)
174+
175+
err = dao.db.Preload("Item").Raw(dataSql, parameters...).Scan(&purchases).Error
176+
if err != nil {
177+
return 0, nil, err
178+
}
179+
180+
itemIds = []int64{}
181+
for _, purchase := range purchases {
182+
itemIds = append(itemIds, purchase.ItemId)
183+
}
184+
185+
var items []*database.Item
186+
err = dao.db.Preload("Stats").Where("id in ?", itemIds).Find(&items).Error
187+
if err != nil {
188+
return 0, nil, err
189+
}
190+
191+
for _, purchase := range purchases {
192+
for _, item := range items {
193+
if purchase.ItemId == item.Id {
194+
purchase.Item = item
195+
}
196+
}
197+
}
198+
199+
return
200+
}

models/item_by_buckets_request.go

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/item_by_objects_request.go

Lines changed: 82 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)