shithub: hugo

Download patch

ref: 112461fded0d7970817ce7bf476c4763922ad314
parent: 94ab125b27a29a65e5ea45efd99dd247084b4c37
author: Cameron Moore <[email protected]>
date: Mon Nov 26 13:40:35 EST 2018

tpl/collections: Add float64 support to where

Fixes #5466

--- a/tpl/collections/where.go
+++ b/tpl/collections/where.go
@@ -79,9 +79,11 @@
 	}
 
 	var ivp, imvp *int64
+	var fvp, fmvp *float64
 	var svp, smvp *string
 	var slv, slmv interface{}
 	var ima []int64
+	var fma []float64
 	var sma []string
 	if mv.Type() == v.Type() {
 		switch v.Kind() {
@@ -95,6 +97,11 @@
 			svp = &sv
 			smv := mv.String()
 			smvp = &smv
+		case reflect.Float64:
+			fv := v.Float()
+			fvp = &fv
+			fmv := mv.Float()
+			fmvp = &fmv
 		case reflect.Struct:
 			switch v.Type() {
 			case timeType:
@@ -136,6 +143,14 @@
 					sma = append(sma, aString)
 				}
 			}
+		case reflect.Float64:
+			fv := v.Float()
+			fvp = &fv
+			for i := 0; i < mv.Len(); i++ {
+				if aFloat, err := toFloat(mv.Index(i)); err == nil {
+					fma = append(fma, aFloat)
+				}
+			}
 		case reflect.Struct:
 			switch v.Type() {
 			case timeType:
@@ -153,52 +168,73 @@
 
 	switch op {
 	case "", "=", "==", "eq":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp == *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp == *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp == *fmvp, nil
 		}
 	case "!=", "<>", "ne":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp != *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp != *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp != *fmvp, nil
 		}
 	case ">=", "ge":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp >= *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp >= *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp >= *fmvp, nil
 		}
 	case ">", "gt":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp > *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp > *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp > *fmvp, nil
 		}
 	case "<=", "le":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp <= *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp <= *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp <= *fmvp, nil
 		}
 	case "<", "lt":
-		if ivp != nil && imvp != nil {
+		switch {
+		case ivp != nil && imvp != nil:
 			return *ivp < *imvp, nil
-		} else if svp != nil && smvp != nil {
+		case svp != nil && smvp != nil:
 			return *svp < *smvp, nil
+		case fvp != nil && fmvp != nil:
+			return *fvp < *fmvp, nil
 		}
 	case "in", "not in":
 		var r bool
-		if ivp != nil && len(ima) > 0 {
+		switch {
+		case ivp != nil && len(ima) > 0:
 			r = ns.In(ima, *ivp)
-		} else if svp != nil {
+		case fvp != nil && len(fma) > 0:
+			r = ns.In(fma, *fvp)
+		case svp != nil:
 			if len(sma) > 0 {
 				r = ns.In(sma, *svp)
 			} else if smvp != nil {
 				r = ns.In(*smvp, *svp)
 			}
-		} else {
+		default:
 			return false, nil
 		}
 		if op == "not in" {
--- a/tpl/collections/where_test.go
+++ b/tpl/collections/where_test.go
@@ -64,6 +64,48 @@
 			},
 		},
 		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 4.0,
+			expect: []map[string]float64{{"a": 3, "b": 4}},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 4.0, op: "!=",
+			expect: []map[string]float64{{"a": 1, "b": 2}, {"a": 5, "x": 4}},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 4.0, op: "<",
+			expect: []map[string]float64{{"a": 1, "b": 2}},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 4.0, op: "<=",
+			expect: []map[string]float64{{"a": 1, "b": 2}, {"a": 3, "b": 4}},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 3}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 2.0, op: ">",
+			expect: []map[string]float64{{"a": 3, "b": 3}},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 3}, {"a": 5, "x": 4},
+			},
+			key: "b", match: 2.0, op: ">=",
+			expect: []map[string]float64{{"a": 1, "b": 2}, {"a": 3, "b": 3}},
+		},
+		{
 			seq: []TstX{
 				{A: "a", B: "b"}, {A: "c", B: "d"}, {A: "e", B: "f"},
 			},
@@ -181,6 +223,15 @@
 			},
 		},
 		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6},
+			},
+			key: "b", op: ">", match: 3.0,
+			expect: []map[string]float64{
+				{"a": 3, "b": 4}, {"a": 5, "b": 6},
+			},
+		},
+		{
 			seq: []TstX{
 				{A: "a", B: "b"}, {A: "c", B: "d"}, {A: "e", B: "f"},
 			},
@@ -199,6 +250,15 @@
 			},
 		},
 		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6},
+			},
+			key: "b", op: "in", match: []float64{3, 4, 5},
+			expect: []map[string]float64{
+				{"a": 3, "b": 4},
+			},
+		},
+		{
 			seq: []map[string][]string{
 				{"a": []string{"A", "B", "C"}, "b": []string{"D", "E", "F"}}, {"a": []string{"G", "H", "I"}, "b": []string{"J", "K", "L"}}, {"a": []string{"M", "N", "O"}, "b": []string{"P", "Q", "R"}},
 			},
@@ -280,6 +340,15 @@
 			},
 		},
 		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6},
+			},
+			key: "b", op: "in", match: ns.Slice(3.0, 4.0, 5.0),
+			expect: []map[string]float64{
+				{"a": 3, "b": 4},
+			},
+		},
+		{
 			seq: []map[string]time.Time{
 				{"a": d1, "b": d2}, {"a": d3, "b": d4}, {"a": d5, "b": d6},
 			},
@@ -330,6 +399,31 @@
 			},
 			key: "b", op: ">", match: nil,
 			expect: []map[string]int{},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3}, {"a": 5, "b": 6},
+			},
+			key: "b", op: "", match: nil,
+			expect: []map[string]float64{
+				{"a": 3},
+			},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3}, {"a": 5, "b": 6},
+			},
+			key: "b", op: "!=", match: nil,
+			expect: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 5, "b": 6},
+			},
+		},
+		{
+			seq: []map[string]float64{
+				{"a": 1, "b": 2}, {"a": 3}, {"a": 5, "b": 6},
+			},
+			key: "b", op: ">", match: nil,
+			expect: []map[string]float64{},
 		},
 		{
 			seq: []map[string]bool{