Skip to content

Commit 71e4170

Browse files
authored
#69 Fix the sum and avg function for the only numeric value. (#70)
1 parent a3c0a6b commit 71e4170

File tree

5 files changed

+89
-4
lines changed

5 files changed

+89
-4
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func main() {
5353
You can download `ajson` cli from the [release page](https://github.com/spyzhov/ajson/releases), or install from the source:
5454

5555
```shell script
56-
go get github.com/spyzhov/ajson/cmd/[email protected].2
56+
go get github.com/spyzhov/ajson/cmd/[email protected].3
5757
```
5858

5959
Usage:

cmd/ajson/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/spyzhov/ajson"
1414
)
1515

16-
var version = "v0.9.2"
16+
var version = "v0.9.3"
1717

1818
func usage() {
1919
text := ``

jsonpath_test.go

+69
Original file line numberDiff line numberDiff line change
@@ -1595,3 +1595,72 @@ func TestEval_issue_67(t *testing.T) {
15951595
})
15961596
}
15971597
}
1598+
1599+
// TestEval_issue_69 is a test for https://github.com/spyzhov/ajson/issues/69
1600+
func TestEval_issue_69(t *testing.T) {
1601+
root := Must(Unmarshal([]byte(`
1602+
{
1603+
"items": [
1604+
{
1605+
"price":1,
1606+
"type": "A"
1607+
},
1608+
{
1609+
"price":2,
1610+
"type": "B"
1611+
},
1612+
{
1613+
"price":3,
1614+
"type": "C"
1615+
},
1616+
null
1617+
]
1618+
}`)))
1619+
1620+
tests := []struct {
1621+
name string
1622+
wantResult interface{}
1623+
}{
1624+
{
1625+
name: `sum($.items[?(@.type == "A")].price)`,
1626+
wantResult: float64(1),
1627+
},
1628+
{
1629+
name: `avg($.items[?(@.type == "A")].price)`,
1630+
wantResult: float64(1),
1631+
},
1632+
{
1633+
name: `sum($.items[?(@.type == "D")].price)`,
1634+
wantResult: nil,
1635+
},
1636+
{
1637+
name: `avg($.items[?(@.type == "D")].price)`,
1638+
wantResult: nil,
1639+
},
1640+
{
1641+
name: `sum($.items[?(@ == null)].price)`,
1642+
wantResult: nil,
1643+
},
1644+
{
1645+
name: `avg($.items[?(@ == null)].price)`,
1646+
wantResult: nil,
1647+
},
1648+
}
1649+
for _, tt := range tests {
1650+
t.Run(tt.name, func(t *testing.T) {
1651+
gotResult, err := Eval(root, tt.name)
1652+
if err != nil {
1653+
t.Errorf("Eval(avg|sum) error = %v", err)
1654+
return
1655+
}
1656+
value, err := gotResult.Value()
1657+
if err != nil {
1658+
t.Errorf("Node.Value() error = %v", err)
1659+
return
1660+
}
1661+
if !reflect.DeepEqual(value, tt.wantResult) {
1662+
t.Errorf("Eval(avg|sum) gotResult = %v, want %v", gotResult, tt.wantResult)
1663+
}
1664+
})
1665+
}
1666+
}

math.go

+14
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,13 @@ var (
407407
}
408408
return valueNode(nil, "avg", Numeric, sum/float64(node.Size())), nil
409409
}
410+
if node.IsNumeric() {
411+
value, err := node.GetNumeric()
412+
if err != nil {
413+
return nil, err
414+
}
415+
return valueNode(nil, "avg", Numeric, value), nil
416+
}
410417
return valueNode(nil, "avg", Null, nil), nil
411418
},
412419
"b64decode": func(node *Node) (result *Node, err error) {
@@ -481,6 +488,13 @@ var (
481488
}
482489
return valueNode(nil, "sum", Numeric, sum), nil
483490
}
491+
if node.IsNumeric() {
492+
value, err := node.GetNumeric()
493+
if err != nil {
494+
return nil, err
495+
}
496+
return valueNode(nil, "sum", Numeric, value), nil
497+
}
484498
return valueNode(nil, "sum", Null, nil), nil
485499
},
486500
"not": func(node *Node) (result *Node, err error) {

math_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ func TestFunctions2(t *testing.T) {
456456
valueNode(nil, "", Numeric, "foo"),
457457
valueNode(nil, "", Numeric, "foo"),
458458
}), fail: true},
459-
{name: "avg error 2", fname: "avg", value: _e, fail: false, result: NullNode("")},
459+
{name: "avg error 2", fname: "avg", value: _e, fail: true},
460460
{name: "avg array 1", fname: "avg", value: ArrayNode("test", []*Node{
461461
NumericNode("", 1),
462462
NumericNode("", 1),
@@ -475,6 +475,7 @@ func TestFunctions2(t *testing.T) {
475475
}), result: NumericNode("", 2)},
476476
{name: "avg array blank", fname: "avg", value: ArrayNode("test", []*Node{}), result: NumericNode("", 0)},
477477
{name: "avg nil", fname: "avg", value: nil, result: NullNode("")},
478+
{name: "avg one", fname: "avg", value: NumericNode("", 123), result: NumericNode("", 123)},
478479

479480
{name: "b64encode_std_padding multiple of 3", fname: "b64encode", value: StringNode("", "Short string"), result: StringNode("", "U2hvcnQgc3RyaW5n")},
480481
{name: "b64encode_std_padding remainder 2", fname: "b64encode", value: StringNode("", "A test string"), result: StringNode("", "QSB0ZXN0IHN0cmluZw==")},
@@ -503,7 +504,7 @@ func TestFunctions2(t *testing.T) {
503504
valueNode(nil, "", Numeric, "foo"),
504505
valueNode(nil, "", Numeric, "foo"),
505506
}), fail: true},
506-
{name: "sum error 2", fname: "sum", value: _e, fail: false, result: NullNode("")},
507+
{name: "sum error 2", fname: "sum", value: _e, fail: true},
507508
{name: "sum array 1", fname: "sum", value: ArrayNode("test", []*Node{
508509
NumericNode("", 1),
509510
NumericNode("", 1),
@@ -522,6 +523,7 @@ func TestFunctions2(t *testing.T) {
522523
}), result: NumericNode("", 6)},
523524
{name: "sum array blank", fname: "sum", value: ArrayNode("test", []*Node{}), result: NumericNode("", 0)},
524525
{name: "sum nil", fname: "sum", value: nil, result: NullNode("")},
526+
{name: "sum one", fname: "sum", value: NumericNode("", 123), result: NumericNode("", 123)},
525527

526528
{name: "rand", fname: "rand", value: StringNode("test", "test"), fail: true},
527529
{name: "randint", fname: "randint", value: StringNode("test", "test"), fail: true},

0 commit comments

Comments
 (0)