package main import ( "bytes" "database/sql" "encoding/csv" "encoding/json" "flag" "fmt" "io" "net/http" "os" "strings" _ "github.com/go-sql-driver/mysql" ) var ( csvPath = flag.String("csv", "aips.csv", "Path to the CSV file containing AIP names") mysqlConnString = flag.String("mysql", "root:12345@tcp(localhost:62001)/MCP", "mysql connection string") elasticSearch = flag.String("elastic", "http://127.0.0.1:62002", "elastic search URL") ) func main() { flag.Parse() file, err := os.Open(*csvPath) assert(err) records, err := csv.NewReader(file).ReadAll() assert(err) r := []string{} for _, record := range records { r = append(r, strings.TrimSpace(record[0])) } result, err := os.OpenFile("aip_names.txt", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) assert(err) // Query mapping to know if it's raw or keyword: /aips/_mapping q := struct { Query struct { Term struct { Name string `json:"name.raw"` } `json:"term"` } `json:"query"` }{} for _, name := range r { q.Query.Term.Name = name var res ElasticAipResponse err = do(*elasticSearch+"/aips/_search", q, &res) assert(err) if res.Hits.Total == 1 { fmt.Println("AIP Found: " + res.Hits.Hits[0].Source.Name) _, err = result.WriteString(name + "\n") assert(err) } else if res.Hits.Total > 1 { fmt.Println("more than one match, this is not expeted") fmt.Println("Name: ", name) os.Exit(1) } } } func do(path string, payload, responsePayload any) error { var body io.Reader if payload != nil { jsonBody, err := json.Marshal(payload) if err != nil { return err } // fmt.Println(string(jsonBody)) body = bytes.NewReader(jsonBody) } req, err := http.NewRequest(http.MethodGet, path, body) if err != nil { return err } req.Header.Set("Content-Type", "application/json") res, err := http.DefaultClient.Do(req) if err != nil { return err } resBody, err := io.ReadAll(res.Body) if err != nil { return err } if res.StatusCode >= 400 { fmt.Println(string(resBody)) return fmt.Errorf("request failed: %s", http.StatusText(res.StatusCode)) } return json.Unmarshal(resBody, responsePayload) } func openDB(connStr string) *sql.DB { db, err := sql.Open("mysql", connStr) assert(err) err = db.Ping() assert(err) return db } func assert(err error) { if err != nil { panic(err) } }