Add measurements to characteristics payload
This commit is contained in:
parent
773987fed3
commit
e30089ecb0
2 changed files with 87 additions and 17 deletions
|
@ -124,10 +124,19 @@ func (c CharacteristicService) list(val *url.Values, claims *Claims) (entity, *a
|
||||||
return nil, newJSONError(err, http.StatusInternalServerError)
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: tack on measurements
|
measurements_opt, err := measurementOptsFromCharacteristics(opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
|
||||||
|
measurements, err := listMeasurements(*measurements_opt, claims)
|
||||||
|
if err != nil {
|
||||||
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
|
||||||
payload := CharacteristicsPayload{
|
payload := CharacteristicsPayload{
|
||||||
Characteristics: characteristics,
|
Characteristics: characteristics,
|
||||||
Measurements: nil,
|
Measurements: measurements,
|
||||||
Strains: strains,
|
Strains: strains,
|
||||||
Species: species,
|
Species: species,
|
||||||
Meta: &CharacteristicMeta{
|
Meta: &CharacteristicMeta{
|
||||||
|
@ -139,7 +148,7 @@ func (c CharacteristicService) list(val *url.Values, claims *Claims) (entity, *a
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c CharacteristicService) get(id int64, genus string, claims *Claims) (entity, *appError) {
|
func (c CharacteristicService) get(id int64, genus string, claims *Claims) (entity, *appError) {
|
||||||
characteristic, err := getCharacteristic(id, claims)
|
characteristic, err := getCharacteristic(id, genus, claims)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, newJSONError(err, http.StatusInternalServerError)
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
@ -159,10 +168,14 @@ func (c CharacteristicService) get(id int64, genus string, claims *Claims) (enti
|
||||||
return nil, newJSONError(err, http.StatusInternalServerError)
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: tack on measurements
|
measurements, _, err := measurementsFromCharacteristicId(id, genus, claims)
|
||||||
|
if err != nil {
|
||||||
|
return nil, newJSONError(err, http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
|
||||||
payload := CharacteristicPayload{
|
payload := CharacteristicPayload{
|
||||||
Characteristic: characteristic,
|
Characteristic: characteristic,
|
||||||
Measurements: nil,
|
Measurements: measurements,
|
||||||
Strains: strains,
|
Strains: strains,
|
||||||
Species: species,
|
Species: species,
|
||||||
}
|
}
|
||||||
|
@ -219,14 +232,18 @@ func listCharacteristics(opt ListOptions, claims *Claims) (*Characteristics, err
|
||||||
var vals []interface{}
|
var vals []interface{}
|
||||||
|
|
||||||
q := `SELECT c.*, array_agg(m.id) AS measurements,
|
q := `SELECT c.*, array_agg(m.id) AS measurements,
|
||||||
array_agg(st.id) AS strains, ct.characteristic_type_name
|
array_agg(st.id) AS strains,
|
||||||
|
ct.characteristic_type_name
|
||||||
FROM characteristics c
|
FROM characteristics c
|
||||||
INNER JOIN characteristic_types ct ON ct.id=c.characteristic_type_id
|
INNER JOIN characteristic_types ct ON ct.id=c.characteristic_type_id
|
||||||
LEFT OUTER JOIN measurements m ON m.characteristic_id=c.id
|
LEFT OUTER JOIN measurements m ON m.characteristic_id=c.id
|
||||||
LEFT OUTER JOIN strains st ON st.id=m.strain_id`
|
LEFT OUTER JOIN strains st ON st.id=m.strain_id
|
||||||
|
INNER JOIN species sp ON sp.id=st.species_id
|
||||||
|
INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=LOWER($1)`
|
||||||
|
vals = append(vals, opt.Genus)
|
||||||
|
|
||||||
if len(opt.Ids) != 0 {
|
if len(opt.Ids) != 0 {
|
||||||
var counter int64 = 1
|
var counter int64 = 2
|
||||||
w := valsIn("c.id", opt.Ids, &vals, &counter)
|
w := valsIn("c.id", opt.Ids, &vals, &counter)
|
||||||
|
|
||||||
q += fmt.Sprintf(" WHERE %s", w)
|
q += fmt.Sprintf(" WHERE %s", w)
|
||||||
|
@ -249,16 +266,21 @@ func listCharacteristics(opt ListOptions, claims *Claims) (*Characteristics, err
|
||||||
|
|
||||||
func strainOptsFromCharacteristics(opt ListOptions) (*ListOptions, error) {
|
func strainOptsFromCharacteristics(opt ListOptions) (*ListOptions, error) {
|
||||||
relatedStrainIds := make([]int64, 0)
|
relatedStrainIds := make([]int64, 0)
|
||||||
|
baseQ := `SELECT DISTINCT m.strain_id
|
||||||
|
FROM measurements m
|
||||||
|
INNER JOIN strains st ON st.id=m.strain_id
|
||||||
|
INNER JOIN species sp ON sp.id=st.species_id
|
||||||
|
INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=LOWER($1)`
|
||||||
if opt.Ids == nil {
|
if opt.Ids == nil {
|
||||||
q := `SELECT DISTINCT strain_id FROM measurements;`
|
q := fmt.Sprintf("%s;", baseQ)
|
||||||
if err := DBH.Select(&relatedStrainIds, q); err != nil {
|
if err := DBH.Select(&relatedStrainIds, q, opt.Genus); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var vals []interface{}
|
var vals []interface{}
|
||||||
var count int64 = 1
|
var count int64 = 2
|
||||||
q := fmt.Sprintf("SELECT DISTINCT strain_id FROM measurements WHERE %s;", valsIn("characteristic_id", opt.Ids, &vals, &count))
|
vals = append(vals, opt.Genus)
|
||||||
|
q := fmt.Sprintf("%s WHERE %s ", baseQ, valsIn("m.characteristic_id", opt.Ids, &vals, &count))
|
||||||
|
|
||||||
if err := DBH.Select(&relatedStrainIds, q, vals...); err != nil {
|
if err := DBH.Select(&relatedStrainIds, q, vals...); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -268,6 +290,33 @@ func strainOptsFromCharacteristics(opt ListOptions) (*ListOptions, error) {
|
||||||
return &ListOptions{Genus: opt.Genus, Ids: relatedStrainIds}, nil
|
return &ListOptions{Genus: opt.Genus, Ids: relatedStrainIds}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func measurementOptsFromCharacteristics(opt ListOptions) (*MeasurementListOptions, error) {
|
||||||
|
relatedMeasurementIds := make([]int64, 0)
|
||||||
|
baseQ := `SELECT m.id
|
||||||
|
FROM measurements m
|
||||||
|
INNER JOIN strains st ON st.id=m.strain_id
|
||||||
|
INNER JOIN species sp ON sp.id=st.species_id
|
||||||
|
INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=LOWER($1)`
|
||||||
|
|
||||||
|
if opt.Ids == nil {
|
||||||
|
q := fmt.Sprintf("%s;", baseQ)
|
||||||
|
if err := DBH.Select(&relatedMeasurementIds, q, opt.Genus); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var vals []interface{}
|
||||||
|
var count int64 = 2
|
||||||
|
vals = append(vals, opt.Genus)
|
||||||
|
q := fmt.Sprintf("%s WHERE %s;", baseQ, valsIn("characteristic_id", opt.Ids, &vals, &count))
|
||||||
|
|
||||||
|
if err := DBH.Select(&relatedMeasurementIds, q, vals...); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &MeasurementListOptions{ListOptions: ListOptions{Genus: opt.Genus, Ids: relatedMeasurementIds}, Strains: nil, Characteristics: nil}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func strainsFromCharacteristicId(id int64, genus string, claims *Claims) (*Strains, *ListOptions, error) {
|
func strainsFromCharacteristicId(id int64, genus string, claims *Claims) (*Strains, *ListOptions, error) {
|
||||||
opt := ListOptions{
|
opt := ListOptions{
|
||||||
Genus: genus,
|
Genus: genus,
|
||||||
|
@ -287,7 +336,26 @@ func strainsFromCharacteristicId(id int64, genus string, claims *Claims) (*Strai
|
||||||
return strains, strains_opt, nil
|
return strains, strains_opt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCharacteristic(id int64, claims *Claims) (*Characteristic, error) {
|
func measurementsFromCharacteristicId(id int64, genus string, claims *Claims) (*Measurements, *MeasurementListOptions, error) {
|
||||||
|
opt := ListOptions{
|
||||||
|
Genus: genus,
|
||||||
|
Ids: []int64{id},
|
||||||
|
}
|
||||||
|
|
||||||
|
measurement_opt, err := measurementOptsFromCharacteristics(opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
measurements, err := listMeasurements(*measurement_opt, claims)
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return measurements, measurement_opt, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCharacteristic(id int64, genus string, claims *Claims) (*Characteristic, error) {
|
||||||
var characteristic Characteristic
|
var characteristic Characteristic
|
||||||
q := `SELECT c.*, array_agg(m.id) AS measurements,
|
q := `SELECT c.*, array_agg(m.id) AS measurements,
|
||||||
array_agg(st.id) AS strains, ct.characteristic_type_name
|
array_agg(st.id) AS strains, ct.characteristic_type_name
|
||||||
|
@ -295,9 +363,11 @@ func getCharacteristic(id int64, claims *Claims) (*Characteristic, error) {
|
||||||
INNER JOIN characteristic_types ct ON ct.id=c.characteristic_type_id
|
INNER JOIN characteristic_types ct ON ct.id=c.characteristic_type_id
|
||||||
LEFT OUTER JOIN measurements m ON m.characteristic_id=c.id
|
LEFT OUTER JOIN measurements m ON m.characteristic_id=c.id
|
||||||
LEFT OUTER JOIN strains st ON st.id=m.strain_id
|
LEFT OUTER JOIN strains st ON st.id=m.strain_id
|
||||||
WHERE c.id=$1
|
INNER JOIN species sp ON sp.id=st.species_id
|
||||||
|
INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=LOWER($1)
|
||||||
|
WHERE c.id=$2
|
||||||
GROUP BY c.id, ct.characteristic_type_name;`
|
GROUP BY c.id, ct.characteristic_type_name;`
|
||||||
if err := DBH.SelectOne(&characteristic, q, id); err != nil {
|
if err := DBH.SelectOne(&characteristic, q, genus, id); err != nil {
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
return nil, ErrCharacteristicNotFound
|
return nil, ErrCharacteristicNotFound
|
||||||
}
|
}
|
||||||
|
|
|
@ -287,7 +287,7 @@ func getStrain(id int64, genus string, claims *Claims) (*Strain, error) {
|
||||||
func speciesOptsFromStrains(opt ListOptions) (*ListOptions, error) {
|
func speciesOptsFromStrains(opt ListOptions) (*ListOptions, error) {
|
||||||
relatedSpeciesIds := make([]int64, 0)
|
relatedSpeciesIds := make([]int64, 0)
|
||||||
|
|
||||||
if opt.Ids == nil {
|
if opt.Ids == nil || len(opt.Ids) == 0 {
|
||||||
q := `SELECT DISTINCT st.species_id
|
q := `SELECT DISTINCT st.species_id
|
||||||
FROM strains st
|
FROM strains st
|
||||||
INNER JOIN species sp ON sp.id=st.species_id
|
INNER JOIN species sp ON sp.id=st.species_id
|
||||||
|
|
Reference in a new issue