Maërlyn

Go és solr

2016. 10. 09.

Időnként azóta is előveszem a Got, most épp az egyik tervezett melóhelyi átállás adta az ötletet a következő játékhoz.

Van egy solr core-unk és egy nodejs microservice-ünk, amik ugyanazokat az adatokat tárolják, csak picit máshogy, és másutt is használjuk őket. Ezt akarjuk kiváltani egyetlen kibővített core-ral, ami mindkét célra alkalmas.

A configot az ini csomaggal olvasom:

cfg, err = ini.LoadSources(ini.LoadOptions{}, 
    "/etc/icom/settings_locationserver.ini")
if err != nil {
	panic(err)
}

A solr csomag felett meg van egy saját wrapperem, ami összeállít és megfuttat egy queryt:

func (sc SolrClient) simpleQuery(q string, rows int)
    *solr.SelectResponse {
	query := solr.Query{
		Params: solr.URLParamMap{
			"q": []string{q},
		},
		Rows: rows,
	}

	res, err := sc.connection.Select(&query)

	if err != nil {
		log.Printf("solr error: %s\n", err)
	}

	return res
}

Ezzel az ID szerinti lekérdezés ilyen egyszerű:

func (sc SolrClient) FindById(id int)
    (map[string]interface{}, bool) {
	res := sc.simpleQuery("location_id:"+strconv.Itoa(id), 1)

	if res.Results.Len() == 0 {
		return nil, false
	}

	return res.Results.Get(0).Fields, true
}

mert az ID saját forrásból jön (mysql auto_inc mező).

Ezekkel a http requestet megoldjuk pár sorral:

func returnJson(w http.ResponseWriter, data interface{}) {
	w.Header().Set("Content-Type", "application/json")
	err := json.NewEncoder(w).Encode(data)

	if err != nil {
		log.Fatal(err)
	}
}

func getLocationById(w http.ResponseWriter, r *http.Request,
    ps httprouter.Params) {
	id, _ := strconv.Atoi(ps.ByName("id"))

	location, found := solrClient.FindById(id)

	if !found {
		w.WriteHeader(404)
		return
	}

	returnJson(w, location)
}