get scraped documents list performance update
This commit is contained in:
@@ -21,6 +21,8 @@ type TenderRepository interface {
|
||||
GetByContractNoticeID(ctx context.Context, contractNoticeID string) (*Tender, error)
|
||||
GetByNoticePublicationID(ctx context.Context, noticePublicationID string) (*Tender, error)
|
||||
GetByContractFolderID(ctx context.Context, contractFolderID string) (*Tender, error)
|
||||
// GetLatestByContractFolderIDs returns the most recently updated tender per distinct contract_folder_id.
|
||||
GetLatestByContractFolderIDs(ctx context.Context, contractFolderIDs []string) (map[string]*Tender, error)
|
||||
GetByProcurementProjectID(ctx context.Context, procurementProjectID string) (*Tender, error)
|
||||
FindTendersWithContentXML(ctx context.Context, limit, skip int) ([]Tender, error)
|
||||
GetTenderCountByCountry(ctx context.Context) (map[string]int64, error)
|
||||
@@ -289,6 +291,76 @@ func (r *tenderRepository) GetByContractFolderID(ctx context.Context, contractFo
|
||||
return &result.Items[0], nil
|
||||
}
|
||||
|
||||
// GetLatestByContractFolderIDs returns one tender per distinct contract_folder_id (latest updated_at).
|
||||
func (r *tenderRepository) GetLatestByContractFolderIDs(ctx context.Context, contractFolderIDs []string) (map[string]*Tender, error) {
|
||||
out := make(map[string]*Tender)
|
||||
if len(contractFolderIDs) == 0 {
|
||||
return out, nil
|
||||
}
|
||||
|
||||
uniq := uniqueNonEmptyTrimmedStrings(contractFolderIDs)
|
||||
if len(uniq) == 0 {
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Allow a few rows per folder in case duplicate folder rows exist despite partial uniques.
|
||||
findLimit := len(uniq) * 3
|
||||
if findLimit < len(uniq)+1 {
|
||||
findLimit = len(uniq) + 1
|
||||
}
|
||||
if findLimit > 100000 {
|
||||
findLimit = 100000
|
||||
}
|
||||
|
||||
result, err := r.ormRepo.FindAll(ctx,
|
||||
bson.M{"contract_folder_id": bson.M{"$in": uniq}},
|
||||
orm.Pagination{
|
||||
Limit: findLimit,
|
||||
Skip: 0,
|
||||
SortField: "updated_at",
|
||||
SortOrder: -1,
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
r.logger.Error("Failed to load tenders by contract folder ids", map[string]interface{}{
|
||||
"folder_count": len(uniq),
|
||||
"error": err.Error(),
|
||||
})
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for i := range result.Items {
|
||||
t := &result.Items[i]
|
||||
cid := strings.TrimSpace(t.ContractFolderID)
|
||||
if cid == "" {
|
||||
continue
|
||||
}
|
||||
prev, ok := out[cid]
|
||||
if !ok || t.UpdatedAt > prev.UpdatedAt {
|
||||
out[cid] = t
|
||||
}
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func uniqueNonEmptyTrimmedStrings(ids []string) []string {
|
||||
seen := make(map[string]struct{}, len(ids))
|
||||
out := make([]string, 0, len(ids))
|
||||
for _, id := range ids {
|
||||
id = strings.TrimSpace(id)
|
||||
if id == "" {
|
||||
continue
|
||||
}
|
||||
if _, dup := seen[id]; dup {
|
||||
continue
|
||||
}
|
||||
seen[id] = struct{}{}
|
||||
out = append(out, id)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// GetByProcurementProjectID finds a tender by UBL ProcurementProject ID (shared across per-lot notices).
|
||||
func (r *tenderRepository) GetByProcurementProjectID(ctx context.Context, procurementProjectID string) (*Tender, error) {
|
||||
filter := bson.M{"procurement_project_id": procurementProjectID}
|
||||
|
||||
Reference in New Issue
Block a user