sort order: strains, species, char type, chars
This commit is contained in:
		
							parent
							
								
									22e4bbe1e4
								
							
						
					
					
						commit
						8e386c3521
					
				
					 5 changed files with 16 additions and 9 deletions
				
			
		| 
						 | 
					@ -30,6 +30,7 @@ type CharacteristicTypeBase struct {
 | 
				
			||||||
type CharacteristicType struct {
 | 
					type CharacteristicType struct {
 | 
				
			||||||
	*CharacteristicTypeBase
 | 
						*CharacteristicTypeBase
 | 
				
			||||||
	Characteristics NullSliceInt64 `db:"characteristics" json:"characteristics"`
 | 
						Characteristics NullSliceInt64 `db:"characteristics" json:"characteristics"`
 | 
				
			||||||
 | 
						SortOrder       int64          `db:"sort_order" json:"sortOrder"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CharacteristicTypes []*CharacteristicType
 | 
					type CharacteristicTypes []*CharacteristicType
 | 
				
			||||||
| 
						 | 
					@ -60,7 +61,8 @@ func (c CharacteristicTypeService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var vals []interface{}
 | 
						var vals []interface{}
 | 
				
			||||||
	sql := `SELECT ct.*, array_agg(c.id) AS characteristics
 | 
						sql := `SELECT ct.*, array_agg(c.id) AS characteristics,
 | 
				
			||||||
 | 
								rank() OVER (ORDER BY ct.characteristic_type_name) AS sort_order
 | 
				
			||||||
			FROM characteristic_types ct
 | 
								FROM characteristic_types ct
 | 
				
			||||||
			INNER JOIN characteristics c ON c.characteristic_type_id=ct.id`
 | 
								INNER JOIN characteristics c ON c.characteristic_type_id=ct.id`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,7 +91,7 @@ func (c CharacteristicTypeService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c CharacteristicTypeService) get(id int64, dummy string) (entity, error) {
 | 
					func (c CharacteristicTypeService) get(id int64, dummy string) (entity, error) {
 | 
				
			||||||
	var characteristic_type CharacteristicType
 | 
						var characteristic_type CharacteristicType
 | 
				
			||||||
	sql := `SELECT ct.*, array_agg(c.id) AS characteristics
 | 
						sql := `SELECT ct.*, array_agg(c.id) AS characteristics, 0 AS sort_order
 | 
				
			||||||
			FROM characteristic_types ct
 | 
								FROM characteristic_types ct
 | 
				
			||||||
			INNER JOIN characteristics c ON c.characteristic_type_id=ct.id
 | 
								INNER JOIN characteristics c ON c.characteristic_type_id=ct.id
 | 
				
			||||||
			WHERE ct.id=$1
 | 
								WHERE ct.id=$1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ type CharacteristicBase struct {
 | 
				
			||||||
	Id                   int64     `json:"id,omitempty"`
 | 
						Id                   int64     `json:"id,omitempty"`
 | 
				
			||||||
	CharacteristicName   string    `db:"characteristic_name" json:"characteristicName"`
 | 
						CharacteristicName   string    `db:"characteristic_name" json:"characteristicName"`
 | 
				
			||||||
	CharacteristicTypeId int64     `db:"characteristic_type_id" json:"characteristicType"`
 | 
						CharacteristicTypeId int64     `db:"characteristic_type_id" json:"characteristicType"`
 | 
				
			||||||
	Sort                 NullInt64 `db:"sort" json:"sort"`
 | 
						SortOrder            NullInt64 `db:"sort_order" json:"sortOrder"`
 | 
				
			||||||
	CreatedAt            time.Time `db:"created_at" json:"createdAt"`
 | 
						CreatedAt            time.Time `db:"created_at" json:"createdAt"`
 | 
				
			||||||
	UpdatedAt            time.Time `db:"updated_at" json:"updatedAt"`
 | 
						UpdatedAt            time.Time `db:"updated_at" json:"updatedAt"`
 | 
				
			||||||
	DeletedAt            NullTime  `db:"deleted_at" json:"deletedAt"`
 | 
						DeletedAt            NullTime  `db:"deleted_at" json:"deletedAt"`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@ CREATE TABLE characteristics (
 | 
				
			||||||
    id BIGSERIAL NOT NULL,
 | 
					    id BIGSERIAL NOT NULL,
 | 
				
			||||||
    characteristic_name TEXT NOT NULL,
 | 
					    characteristic_name TEXT NOT NULL,
 | 
				
			||||||
    characteristic_type_id BIGINT NOT NULL,
 | 
					    characteristic_type_id BIGINT NOT NULL,
 | 
				
			||||||
    sort BIGINT NULL,
 | 
					    sort_order BIGINT NULL,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    created_at TIMESTAMP WITH TIME ZONE NOT NULL,
 | 
					    created_at TIMESTAMP WITH TIME ZONE NOT NULL,
 | 
				
			||||||
    updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
 | 
					    updated_at TIMESTAMP WITH TIME ZONE NOT NULL,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,7 @@ type Species struct {
 | 
				
			||||||
	GenusName    string         `db:"genus_name" json:"genusName"`
 | 
						GenusName    string         `db:"genus_name" json:"genusName"`
 | 
				
			||||||
	Strains      NullSliceInt64 `db:"strains" json:"strains"`
 | 
						Strains      NullSliceInt64 `db:"strains" json:"strains"`
 | 
				
			||||||
	TotalStrains int64          `db:"total_strains" json:"totalStrains"`
 | 
						TotalStrains int64          `db:"total_strains" json:"totalStrains"`
 | 
				
			||||||
 | 
						SortOrder    int64          `db:"sort_order" json:"sortOrder"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type ManySpecies []*Species
 | 
					type ManySpecies []*Species
 | 
				
			||||||
| 
						 | 
					@ -79,7 +80,8 @@ func (s SpeciesService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var vals []interface{}
 | 
						var vals []interface{}
 | 
				
			||||||
	sql := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains,
 | 
						sql := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains,
 | 
				
			||||||
			COUNT(st) AS total_strains
 | 
								COUNT(st) AS total_strains,
 | 
				
			||||||
 | 
								rank() OVER (ORDER BY sp.species_name ASC) AS sort_order
 | 
				
			||||||
			FROM species sp
 | 
								FROM species sp
 | 
				
			||||||
			INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
								INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
				
			||||||
			LEFT OUTER JOIN strains st ON st.species_id=sp.id`
 | 
								LEFT OUTER JOIN strains st ON st.species_id=sp.id`
 | 
				
			||||||
| 
						 | 
					@ -110,7 +112,7 @@ func (s SpeciesService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
func (s SpeciesService) get(id int64, genus string) (entity, error) {
 | 
					func (s SpeciesService) get(id int64, genus string) (entity, error) {
 | 
				
			||||||
	var species Species
 | 
						var species Species
 | 
				
			||||||
	q := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains,
 | 
						q := `SELECT sp.*, g.genus_name, array_agg(st.id) AS strains,
 | 
				
			||||||
		COUNT(st) AS total_strains
 | 
							COUNT(st) AS total_strains, 0 AS sort_order
 | 
				
			||||||
		FROM species sp
 | 
							FROM species sp
 | 
				
			||||||
		INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
							INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
				
			||||||
		LEFT OUTER JOIN strains st ON st.species_id=sp.id
 | 
							LEFT OUTER JOIN strains st ON st.species_id=sp.id
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ type Strain struct {
 | 
				
			||||||
	*StrainBase
 | 
						*StrainBase
 | 
				
			||||||
	Measurements      NullSliceInt64 `db:"measurements" json:"measurements"`
 | 
						Measurements      NullSliceInt64 `db:"measurements" json:"measurements"`
 | 
				
			||||||
	TotalMeasurements int64          `db:"total_measurements" json:"totalMeasurements"`
 | 
						TotalMeasurements int64          `db:"total_measurements" json:"totalMeasurements"`
 | 
				
			||||||
 | 
						SortOrder         int64          `db:"sort_order" json:"sortOrder"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type Strains []*Strain
 | 
					type Strains []*Strain
 | 
				
			||||||
| 
						 | 
					@ -80,7 +81,8 @@ func (s StrainService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var vals []interface{}
 | 
						var vals []interface{}
 | 
				
			||||||
	sql := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements
 | 
						sql := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements,
 | 
				
			||||||
 | 
							rank() OVER (ORDER BY sp.species_name ASC, st.type_strain ASC, st.strain_name ASC) AS sort_order
 | 
				
			||||||
		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
 | 
				
			||||||
		INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
							INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
				
			||||||
| 
						 | 
					@ -99,7 +101,7 @@ func (s StrainService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
		sql += " WHERE (" + strings.Join(conds, ") AND (") + ")"
 | 
							sql += " WHERE (" + strings.Join(conds, ") AND (") + ")"
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sql += " GROUP BY st.id, st.species_id;"
 | 
						sql += " GROUP BY st.id, st.species_id, sp.species_name;"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	strains := make(Strains, 0)
 | 
						strains := make(Strains, 0)
 | 
				
			||||||
	err := DBH.Select(&strains, sql, vals...)
 | 
						err := DBH.Select(&strains, sql, vals...)
 | 
				
			||||||
| 
						 | 
					@ -111,7 +113,8 @@ func (s StrainService) list(val *url.Values) (entity, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s StrainService) get(id int64, genus string) (entity, error) {
 | 
					func (s StrainService) get(id int64, genus string) (entity, error) {
 | 
				
			||||||
	var strain Strain
 | 
						var strain Strain
 | 
				
			||||||
	q := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements
 | 
						q := `SELECT st.*, array_agg(m.id) AS measurements, COUNT(m) AS total_measurements,
 | 
				
			||||||
 | 
							0 AS sort_order
 | 
				
			||||||
		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
 | 
				
			||||||
		INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
							INNER JOIN genera g ON g.id=sp.genus_id AND LOWER(g.genus_name)=$1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue