Skip to content
Snippets Groups Projects
Commit 1bf3a553 authored by Tucker Gary Siegel's avatar Tucker Gary Siegel
Browse files

allow repeats

parent b11a4971
No related branches found
No related tags found
No related merge requests found
...@@ -44,8 +44,9 @@ func GetDailyGdd(c *fiber.Ctx) error { ...@@ -44,8 +44,9 @@ func GetDailyGdd(c *fiber.Ctx) error {
// @Param latitude query number true "Latitude to search for" // @Param latitude query number true "Latitude to search for"
// @Param longitude query number true "Longitude to search for" // @Param longitude query number true "Longitude to search for"
// @Param accumulate query boolean true "Accumulate gdd values" // @Param accumulate query boolean true "Accumulate gdd values"
// @Param repeatYears query number false "number of times to repeat the request. When included with planting date, will extrapolate plantingdate -> end of repeatYears range"
// @Router /gdd/normals [get] // @Router /gdd/normals [get]
func GetNormalGdd(c *fiber.Ctx) error { func GetNormalGdd(c *fiber.Ctx) error {
request := models.BuildGddRequest(c) request, repeat := models.BuildNormalsGddRequest(c)
return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request)) return c.Status(fiber.StatusOK).JSON(services.GetNormalValues(request, repeat))
} }
...@@ -29,6 +29,15 @@ type GddRequest struct { ...@@ -29,6 +29,15 @@ type GddRequest struct {
PlantingDate time.Time `json:"plantingDate"` PlantingDate time.Time `json:"plantingDate"`
} }
type NormalsGddRequest struct {
Product string `json:"product"`
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
Accumulate bool `json:"accumulate"`
PlantingDate time.Time `json:"plantingDate"`
RepeatYears int `json:"repeatYears"`
}
func (r GddRequest) Validate() error { func (r GddRequest) Validate() error {
return validation.ValidateStruct(&r, return validation.ValidateStruct(&r,
// validation.Field(&r.Year, validation.Required, validation.Min(1981), validation.Max(time.Now().Year())), // validation.Field(&r.Year, validation.Required, validation.Min(1981), validation.Max(time.Now().Year())),
...@@ -88,6 +97,22 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest { ...@@ -88,6 +97,22 @@ var BuildGddRequest = func(c *fiber.Ctx) GddRequest {
return rNew return rNew
} }
var BuildNormalsGddRequest = func(c *fiber.Ctx) (GddRequest, int) {
gddReq := BuildGddRequest(c)
repeatYears, errYears := strconv.Atoi(c.Query("repeatYears", "1"))
if errYears != nil {
panic(errors.NewBadRequest(nil).PutDetail("reason", "repeat years must be an integer"))
}
if repeatYears < 1 || repeatYears > 3 {
panic(errors.NewBadRequest(nil).PutDetail("reason", "repeat years must be between 1 and 3 inclusive"))
}
return gddReq, repeatYears
}
var BuildYearlessGddRequest = func(c *fiber.Ctx) GddRequest { var BuildYearlessGddRequest = func(c *fiber.Ctx) GddRequest {
product := c.Query("product") product := c.Query("product")
latitude, errLat := strconv.ParseFloat(c.Query("latitude"), 64) latitude, errLat := strconv.ParseFloat(c.Query("latitude"), 64)
......
...@@ -120,7 +120,7 @@ func getNormals(request models.CSVRequest, dates []time.Time) []float64 { ...@@ -120,7 +120,7 @@ func getNormals(request models.CSVRequest, dates []time.Time) []float64 {
Accumulate: true, Accumulate: true,
} }
gddValues := GetNormalValues(gddRequest).GddValues gddValues := GetNormalValues(gddRequest, 1).GddValues
for len(gddValues) < 365 { for len(gddValues) < 365 {
gddValues = append(gddValues, math.NaN()) gddValues = append(gddValues, math.NaN())
} }
......
...@@ -239,7 +239,7 @@ func forecast(ctx common.DawnCtx, gddReq models.GddRequest, plantdate time.Time, ...@@ -239,7 +239,7 @@ func forecast(ctx common.DawnCtx, gddReq models.GddRequest, plantdate time.Time,
// //
// this function allows normals to "wrap around" to get continuous values // this function allows normals to "wrap around" to get continuous values
func comparisonNormals(request models.GddRequest, plantdate time.Time, matches map[string]float64) map[string]time.Time { func comparisonNormals(request models.GddRequest, plantdate time.Time, matches map[string]float64) map[string]time.Time {
normals := GetNormalValues(request) normals := GetNormalValues(request, 1)
observedValues := normals.GddValues observedValues := normals.GddValues
accumulatedGdds := 0.0 accumulatedGdds := 0.0
currentMatch := 0 currentMatch := 0
......
...@@ -44,7 +44,7 @@ func GetGddValues(ctx common.DawnCtx, request models.GddRequest) models.GddRespo ...@@ -44,7 +44,7 @@ func GetGddValues(ctx common.DawnCtx, request models.GddRequest) models.GddRespo
return returnGdds return returnGdds
} }
func GetNormalValues(request models.GddRequest) models.GddResponse { func GetNormalValues(request models.GddRequest, repeatYears int) models.GddResponse {
product := enums.GetProductFromString(request.Product) product := enums.GetProductFromString(request.Product)
gs := persistence.GetLastNormalsYearly(request.BuildLocation()) gs := persistence.GetLastNormalsYearly(request.BuildLocation())
var returnGdds models.GddResponse var returnGdds models.GddResponse
...@@ -59,7 +59,7 @@ func GetNormalValues(request models.GddRequest) models.GddResponse { ...@@ -59,7 +59,7 @@ func GetNormalValues(request models.GddRequest) models.GddResponse {
sliceDateInt = 0 sliceDateInt = 0
} }
for i := sliceDateInt; i < len(gs[0].MinTemps)*2; i++ { //; i++ { for i := sliceDateInt; i < len(gs[0].MinTemps)*repeatYears; i++ { //; i++ {
row := []float64{} row := []float64{}
idx := i idx := i
if i >= len(gs[0].MinTemps) { if i >= len(gs[0].MinTemps) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment