OOKNET                             [ /  search the index  ]  
──────────────────────────────────────────────────────────────────────────────────────
══════════════════════════════════════════════════════════════════════════════════════
OOKNET   [ /  search  ]  
────────────────────────────────────────────────
════════════════════════════════════════════════
 
 
master @ 173 LINES
 
[ HISTORY ]  [ UP ]
 

package indexes

import (
	"database/sql"
	"fmt"

	"github.com/charmbracelet/log"
)

var allClasses = []string{
	"warrior", "paladin", "hunter", "rogue", "priest",
	"death_knight", "shaman", "mage", "warlock", "monk", "druid",
}

var allRegions = []string{"us", "eu", "kr", "tw"}

func GenerateAllIndexes(db *sql.DB, outDir string) error {
	log.Info("Starting comprehensive index generation")

	// 1. Root index
	if err := GenerateRootIndex(outDir); err != nil {
		return fmt.Errorf("root index: %w", err)
	}

	// 2. Seasons index
	if err := GenerateSeasonsIndex(db, outDir); err != nil {
		return fmt.Errorf("seasons index: %w", err)
	}

	// 3. Get current season for season-specific indexes
	seasonID, err := getCurrentSeasonID(db)
	if err != nil {
		return fmt.Errorf("get current season: %w", err)
	}
	if seasonID == 0 {
		log.Warn("No current season found, using season 1 as default")
		seasonID = 1
	}

	log.Info("Generating indexes for season", "season", seasonID)

	// 4. Season scope index
	if err := GenerateSeasonScopeIndex(outDir, seasonID); err != nil {
		return fmt.Errorf("season scope index: %w", err)
	}

	// 5. Global dungeons index
	if err := GenerateGlobalDungeonsIndex(db, outDir, seasonID); err != nil {
		return fmt.Errorf("global dungeons index: %w", err)
	}

	// 6. Regional indexes (realms + realm dungeons)
	for _, region := range allRegions {
		// Regional realms index
		if err := GenerateRegionalRealmsIndex(db, outDir, seasonID, region); err != nil 
{
			return fmt.Errorf("regional realms index for %s: %w", region, err)
		}

		// Get realms for this region
		realms, err := getRealmSlugsForRegion(db, region)
		if err != nil {
			return fmt.Errorf("get realms for %s: %w", region, err)
		}

		// Generate dungeons index for each realm
		for _, realm := range realms {
			if err := GenerateRealmDungeonsIndex(db, outDir, seasonID, region, realm); err 
!= nil {
				log.Warn("Failed to generate realm dungeons index", "region", region, "realm",
 realm, "error", err)
			}
		}
	}

	// 7. Players scope index
	if err := GeneratePlayersScopeIndex(outDir, seasonID); err != nil {
		return fmt.Errorf("players scope index: %w", err)
	}

	// 8. Players regional index
	if err := GeneratePlayersRegionalIndex(outDir, seasonID); err != nil {
		return fmt.Errorf("players regional index: %w", err)
	}

	// 9. Players realm indexes
	if err := GeneratePlayersRealmRegionIndex(outDir, seasonID); err != nil {
		return fmt.Errorf("players realm region index: %w", err)
	}

	for _, region := range allRegions {
		if err := GeneratePlayersRealmListIndex(db, outDir, seasonID, region); err != ni
l {
			return fmt.Errorf("players realm list index for %s: %w", region, err)
		}
	}

	// 10. Players class index
	if err := GeneratePlayersClassIndex(outDir, seasonID); err != nil {
		return fmt.Errorf("players class index: %w", err)
	}

	// 11. Class-specific indexes
	for _, classKey := range allClasses {
		// Class scope index
		if err := GenerateClassScopeIndex(outDir, seasonID, classKey); err != nil {
			log.Warn("Failed to generate class scope index", "class", classKey, "error", er
r)
			continue
		}

		// Class regional index
		if err := GenerateClassRegionalIndex(outDir, seasonID, classKey); err != nil {
			log.Warn("Failed to generate class regional index", "class", classKey, "error",
 err)
		}

		// Class realm region index
		if err := GenerateClassRealmRegionIndex(outDir, seasonID, classKey); err != nil 
{
			log.Warn("Failed to generate class realm region index", "class", classKey, "err
or", err)
		}

		// Class realm list indexes for each region
		for _, region := range allRegions {
			if err := GenerateClassRealmListIndex(db, outDir, seasonID, classKey, region); 
err != nil {
				log.Warn("Failed to generate class realm list index", "class", classKey, "regi
on", region, "error", err)
			}
		}
	}

	log.Info("Completed comprehensive index generation")
	return nil
}

func getCurrentSeasonID(db *sql.DB) (int, error) {
	var seasonID int
	err := db.QueryRow(`
		SELECT DISTINCT season_number
		FROM seasons
		WHERE end_timestamp IS NULL
		ORDER BY season_number DESC
		LIMIT 1
	`).Scan(&seasonID)

	if err == sql.ErrNoRows {
		err = db.QueryRow(`
			SELECT DISTINCT season_number
			FROM seasons
			ORDER BY season_number DESC
			LIMIT 1
		`).Scan(&seasonID)
	}

	if err == sql.ErrNoRows {
		return 0, nil
	}

	return seasonID, err
}

func getRealmSlugsForRegion(db *sql.DB, region string) ([]string, error) {
	rows, err := db.Query(`SELECT slug FROM realms WHERE region = ? ORDER BY slug`, r
egion)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var slugs []string
	for rows.Next() {
		var slug string
		if err := rows.Scan(&slug); err != nil {
			return nil, err
		}
		slugs = append(slugs, slug)
	}

	return slugs, nil
}

package indexes

import (
	"database/sql"
	"fmt"

	"github.com/charmbracelet/log"
)

var allClasses = []string{
	"warrior", "paladin", "hunter", "rogue", "p
riest",
	"death_knight", "shaman", "mage", "warlock"
, "monk", "druid",
}

var allRegions = []string{"us", "eu", "kr", 
"tw"}

func GenerateAllIndexes(db *sql.DB, outDir s
tring) error {
	log.Info("Starting comprehensive index gene
ration")

	// 1. Root index
	if err := GenerateRootIndex(outDir); err !=
 nil {
		return fmt.Errorf("root index: %w", err)
	}

	// 2. Seasons index
	if err := GenerateSeasonsIndex(db, outDir);
 err != nil {
		return fmt.Errorf("seasons index: %w", err
)
	}

	// 3. Get current season for season-specifi
c indexes
	seasonID, err := getCurrentSeasonID(db)
	if err != nil {
		return fmt.Errorf("get current season: %w"
, err)
	}
	if seasonID == 0 {
		log.Warn("No current season found, using s
eason 1 as default")
		seasonID = 1
	}

	log.Info("Generating indexes for season", "
season", seasonID)

	// 4. Season scope index
	if err := GenerateSeasonScopeIndex(outDir, 
seasonID); err != nil {
		return fmt.Errorf("season scope index: %w"
, err)
	}

	// 5. Global dungeons index
	if err := GenerateGlobalDungeonsIndex(db, o
utDir, seasonID); err != nil {
		return fmt.Errorf("global dungeons index: 
%w", err)
	}

	// 6. Regional indexes (realms + realm dung
eons)
	for _, region := range allRegions {
		// Regional realms index
		if err := GenerateRegionalRealmsIndex(db, 
outDir, seasonID, region); err != nil {
			return fmt.Errorf("regional realms index 
for %s: %w", region, err)
		}

		// Get realms for this region
		realms, err := getRealmSlugsForRegion(db, 
region)
		if err != nil {
			return fmt.Errorf("get realms for %s: %w"
, region, err)
		}

		// Generate dungeons index for each realm
		for _, realm := range realms {
			if err := GenerateRealmDungeonsIndex(db, 
outDir, seasonID, region, realm); err != nil
 {
				log.Warn("Failed to generate realm dunge
ons index", "region", region, "realm", realm
, "error", err)
			}
		}
	}

	// 7. Players scope index
	if err := GeneratePlayersScopeIndex(outDir,
 seasonID); err != nil {
		return fmt.Errorf("players scope index: %w
", err)
	}

	// 8. Players regional index
	if err := GeneratePlayersRegionalIndex(outD
ir, seasonID); err != nil {
		return fmt.Errorf("players regional index:
 %w", err)
	}

	// 9. Players realm indexes
	if err := GeneratePlayersRealmRegionIndex(o
utDir, seasonID); err != nil {
		return fmt.Errorf("players realm region in
dex: %w", err)
	}

	for _, region := range allRegions {
		if err := GeneratePlayersRealmListIndex(db
, outDir, seasonID, region); err != nil {
			return fmt.Errorf("players realm list ind
ex for %s: %w", region, err)
		}
	}

	// 10. Players class index
	if err := GeneratePlayersClassIndex(outDir,
 seasonID); err != nil {
		return fmt.Errorf("players class index: %w
", err)
	}

	// 11. Class-specific indexes
	for _, classKey := range allClasses {
		// Class scope index
		if err := GenerateClassScopeIndex(outDir, 
seasonID, classKey); err != nil {
			log.Warn("Failed to generate class scope 
index", "class", classKey, "error", err)
			continue
		}

		// Class regional index
		if err := GenerateClassRegionalIndex(outDi
r, seasonID, classKey); err != nil {
			log.Warn("Failed to generate class region
al index", "class", classKey, "error", err)
		}

		// Class realm region index
		if err := GenerateClassRealmRegionIndex(ou
tDir, seasonID, classKey); err != nil {
			log.Warn("Failed to generate class realm 
region index", "class", classKey, "error", e
rr)
		}

		// Class realm list indexes for each regio
n
		for _, region := range allRegions {
			if err := GenerateClassRealmListIndex(db,
 outDir, seasonID, classKey, region); err !=
 nil {
				log.Warn("Failed to generate class realm
 list index", "class", classKey, "region", r
egion, "error", err)
			}
		}
	}

	log.Info("Completed comprehensive index gen
eration")
	return nil
}

func getCurrentSeasonID(db *sql.DB) (int, er
ror) {
	var seasonID int
	err := db.QueryRow(`
		SELECT DISTINCT season_number
		FROM seasons
		WHERE end_timestamp IS NULL
		ORDER BY season_number DESC
		LIMIT 1
	`).Scan(&seasonID)

	if err == sql.ErrNoRows {
		err = db.QueryRow(`
			SELECT DISTINCT season_number
			FROM seasons
			ORDER BY season_number DESC
			LIMIT 1
		`).Scan(&seasonID)
	}

	if err == sql.ErrNoRows {
		return 0, nil
	}

	return seasonID, err
}

func getRealmSlugsForRegion(db *sql.DB, regi
on string) ([]string, error) {
	rows, err := db.Query(`SELECT slug FROM rea
lms WHERE region = ? ORDER BY slug`, region)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var slugs []string
	for rows.Next() {
		var slug string
		if err := rows.Scan(&slug); err != nil {
			return nil, err
		}
		slugs = append(slugs, slug)
	}

	return slugs, nil
}
 
──────────────────────────────────────────────────────────────────────────────────────
OOKNET
────────────────────────────────────────────────
OOKNET