update fuction filter
This commit is contained in:
@@ -282,7 +282,33 @@ func (h *RetribusiHandler) GetRetribusiDynamic(c *gin.Context) {
|
||||
// fetchRetribusisDynamic executes dynamic query
|
||||
func (h *RetribusiHandler) fetchRetribusisDynamic(ctx context.Context, dbConn *sql.DB, query utils.DynamicQuery) ([]retribusi.Retribusi, int, error) {
|
||||
// Setup query builder
|
||||
builder := utils.NewQueryBuilder("data_retribusi").
|
||||
countBuilder := utils.NewQueryBuilder("data_retribusi").
|
||||
SetColumnMapping(map[string]string{
|
||||
"jenis": "Jenis",
|
||||
"pelayanan": "Pelayanan",
|
||||
"dinas": "Dinas",
|
||||
"kelompok_obyek": "Kelompok_obyek",
|
||||
"Kode_tarif": "Kode_tarif",
|
||||
"kode_tarif": "Kode_tarif",
|
||||
"tarif": "Tarif",
|
||||
"satuan": "Satuan",
|
||||
"tarif_overtime": "Tarif_overtime",
|
||||
"satuan_overtime": "Satuan_overtime",
|
||||
"rekening_pokok": "Rekening_pokok",
|
||||
"rekening_denda": "Rekening_denda",
|
||||
"uraian_1": "Uraian_1",
|
||||
"uraian_2": "Uraian_2",
|
||||
"uraian_3": "Uraian_3",
|
||||
}).
|
||||
SetAllowedColumns([]string{
|
||||
"id", "status", "sort", "user_created", "date_created",
|
||||
"user_updated", "date_updated", "Jenis", "Pelayanan",
|
||||
"Dinas", "Kelompok_obyek", "Kode_tarif", "Tarif", "Satuan",
|
||||
"Tarif_overtime", "Satuan_overtime", "Rekening_pokok",
|
||||
"Rekening_denda", "Uraian_1", "Uraian_2", "Uraian_3",
|
||||
})
|
||||
|
||||
mainBuilder := utils.NewQueryBuilder("data_retribusi").
|
||||
SetColumnMapping(map[string]string{
|
||||
"jenis": "Jenis",
|
||||
"pelayanan": "Pelayanan",
|
||||
@@ -310,7 +336,6 @@ func (h *RetribusiHandler) fetchRetribusisDynamic(ctx context.Context, dbConn *s
|
||||
|
||||
// Add default filter to exclude deleted records
|
||||
if len(query.Filters) > 0 {
|
||||
// If there are existing filters, add the default filter as the first group
|
||||
query.Filters = append([]utils.FilterGroup{{
|
||||
Filters: []utils.DynamicFilter{{
|
||||
Column: "status",
|
||||
@@ -320,7 +345,6 @@ func (h *RetribusiHandler) fetchRetribusisDynamic(ctx context.Context, dbConn *s
|
||||
LogicOp: "AND",
|
||||
}}, query.Filters...)
|
||||
} else {
|
||||
// If no existing filters, just add the default filter
|
||||
query.Filters = []utils.FilterGroup{{
|
||||
Filters: []utils.DynamicFilter{{
|
||||
Column: "status",
|
||||
@@ -331,82 +355,46 @@ func (h *RetribusiHandler) fetchRetribusisDynamic(ctx context.Context, dbConn *s
|
||||
}}
|
||||
}
|
||||
|
||||
// Execute concurrent queries
|
||||
var (
|
||||
retribusis []retribusi.Retribusi
|
||||
total int
|
||||
wg sync.WaitGroup
|
||||
errChan = make(chan error, 2)
|
||||
mu sync.Mutex
|
||||
)
|
||||
// Execute queries sequentially to avoid race conditions
|
||||
var total int
|
||||
var retribusis []retribusi.Retribusi
|
||||
|
||||
// Fetch total count
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
countQuery := query
|
||||
countQuery.Limit = 0
|
||||
countQuery.Offset = 0
|
||||
// 1. Get total count first
|
||||
countQuery := query
|
||||
countQuery.Limit = 0
|
||||
countQuery.Offset = 0
|
||||
|
||||
countSQL, countArgs, err := builder.BuildCountQuery(countQuery)
|
||||
countSQL, countArgs, err := countBuilder.BuildCountQuery(countQuery)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("failed to build count query: %w", err)
|
||||
}
|
||||
|
||||
if err := dbConn.QueryRowContext(ctx, countSQL, countArgs...).Scan(&total); err != nil {
|
||||
return nil, 0, fmt.Errorf("failed to get total count: %w", err)
|
||||
}
|
||||
|
||||
// 2. Get main data
|
||||
mainSQL, mainArgs, err := mainBuilder.BuildQuery(query)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("failed to build main query: %w", err)
|
||||
}
|
||||
|
||||
rows, err := dbConn.QueryContext(ctx, mainSQL, mainArgs...)
|
||||
if err != nil {
|
||||
return nil, 0, fmt.Errorf("failed to execute main query: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
retribusi, err := h.scanRetribusi(rows)
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to build count query: %w", err)
|
||||
return
|
||||
return nil, 0, fmt.Errorf("failed to scan retribusi: %w", err)
|
||||
}
|
||||
retribusis = append(retribusis, retribusi)
|
||||
}
|
||||
|
||||
if err := dbConn.QueryRowContext(ctx, countSQL, countArgs...).Scan(&total); err != nil {
|
||||
errChan <- fmt.Errorf("failed to get total count: %w", err)
|
||||
return
|
||||
}
|
||||
}()
|
||||
|
||||
// Fetch main data
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
|
||||
mainSQL, mainArgs, err := builder.BuildQuery(query)
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to build main query: %w", err)
|
||||
return
|
||||
}
|
||||
|
||||
rows, err := dbConn.QueryContext(ctx, mainSQL, mainArgs...)
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to execute main query: %w", err)
|
||||
return
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var results []retribusi.Retribusi
|
||||
for rows.Next() {
|
||||
retribusi, err := h.scanRetribusi(rows)
|
||||
if err != nil {
|
||||
errChan <- fmt.Errorf("failed to scan retribusi: %w", err)
|
||||
return
|
||||
}
|
||||
results = append(results, retribusi)
|
||||
}
|
||||
|
||||
if err := rows.Err(); err != nil {
|
||||
errChan <- fmt.Errorf("rows iteration error: %w", err)
|
||||
return
|
||||
}
|
||||
|
||||
mu.Lock()
|
||||
retribusis = results
|
||||
mu.Unlock()
|
||||
}()
|
||||
|
||||
// Wait for all goroutines
|
||||
wg.Wait()
|
||||
close(errChan)
|
||||
|
||||
// Check for errors
|
||||
for err := range errChan {
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, 0, fmt.Errorf("rows iteration error: %w", err)
|
||||
}
|
||||
|
||||
return retribusis, total, nil
|
||||
|
||||
Reference in New Issue
Block a user