update fuction filter

This commit is contained in:
2025-09-10 09:16:01 +07:00
parent 79e65494df
commit e61eee5f76
7 changed files with 1458 additions and 564 deletions

View File

@@ -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