Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added DateCompare function #182

Merged
merged 175 commits into from
Nov 20, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
5ee0f12
add pkg/stdlib/objects Length function
Oct 6, 2018
62a0301
rename lenght.go -> length.go
Oct 6, 2018
42233b4
fix tests according to other tests
Oct 6, 2018
aa96c67
add new tests to length tests
Oct 6, 2018
29edbb7
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 7, 2018
e769e19
delete objects method Length
Oct 7, 2018
1bfe52c
add objects method Has
Oct 7, 2018
e9f1976
add objects function Keys
Oct 7, 2018
f3a43f7
Merge pull request #1 from 3timeslazy/feature/values_object_get
Oct 7, 2018
efa5e3b
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 7, 2018
984d308
small fixes in Keys and Has functions
Oct 7, 2018
945fda6
Merge branch 'master' of https://github.com/3timeslazy/ferret
Oct 7, 2018
2a925a0
change Has function
Oct 7, 2018
28c4d00
unit tests for Keys function
Oct 7, 2018
1810e08
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 7, 2018
8be47a5
add unit tests for merge. also little change in lib.go
Oct 8, 2018
32dd9be
add doc to Keys function
Oct 8, 2018
df36cbf
Merge function prototype
Oct 8, 2018
2d5175b
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 9, 2018
0d55f59
add unit tests for KEEP function
Oct 9, 2018
9a01e2c
added KEEP function
Oct 9, 2018
5950e9b
added doc for KEYS function
Oct 9, 2018
2244fe4
update lib.go
Oct 9, 2018
018c67a
update lib.go
Oct 9, 2018
5563799
merge with feature/_objects_keep
Oct 9, 2018
0895476
merge with origin master
Oct 9, 2018
74539ac
upd merge prototype
Oct 9, 2018
1bb7455
addded isEqualObjects function to objects tests
Oct 9, 2018
c576f1b
Merge pull request #2 from 3timeslazy/feature/_objects_keep
Oct 9, 2018
f661b6c
merge with MontFerret/ferret origin master
Oct 9, 2018
00183a4
Merge branch 'master' of https://github.com/3timeslazy/ferret
Oct 9, 2018
9d76a5c
change object method Compare
Oct 10, 2018
c4ef910
added unit tests for Compare method
Oct 10, 2018
15a7ecd
changed Compare method
Oct 10, 2018
070a337
fix Compare method
Oct 10, 2018
4e933c6
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 10, 2018
1c32d2a
rename method Clone to Copy
Oct 10, 2018
c93a54f
added Cloneable interface
Oct 10, 2018
d0c77fc
added Value to Cloneable interface
Oct 11, 2018
6410c5e
implemented Cloneable intefrace by array
Oct 11, 2018
ebbfb87
added some more unit tests for values.Array
Oct 11, 2018
591b153
fix values.Array.Compare method
Oct 11, 2018
7935b70
added one more unit test
Oct 11, 2018
0f02c54
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 11, 2018
ccfb817
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 11, 2018
ca39ad8
implemented Cloneable interface by Object
Oct 11, 2018
a38f0f8
unit tests for Object.Clone
Oct 11, 2018
6a1f475
move core.IsCloneable to value.go
Oct 12, 2018
5ec2545
change Clone function
Oct 12, 2018
60575ac
move IsClonable to package values
Oct 12, 2018
705fb89
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 12, 2018
646ed38
Merge pull request #3 from 3timeslazy/feature/#95_deepclone
Oct 13, 2018
bad4c7d
Merge pull request #4 from 3timeslazy/bugfix/#89_compare
Oct 13, 2018
b4e6ce9
Merge pull request #5 from 3timeslazy/bugfix/#97_array_compare
Oct 13, 2018
eec1be6
merge with MontFerret/ferret master
Oct 13, 2018
ca67a11
updated MERGE unit tests
Oct 13, 2018
f761dd8
added MERGE function
Oct 13, 2018
599768f
added MERGE to lib
Oct 13, 2018
56a3680
added one more test
Oct 13, 2018
fcce072
changed MERGE function
Oct 13, 2018
864e6ec
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 13, 2018
95d5062
rewrite a few comments according to Go Best Practices
Oct 13, 2018
9f24172
rewrite comments
Oct 14, 2018
7d60caf
merge with MontFerret/ferret master
Oct 14, 2018
243b053
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 14, 2018
80ac30e
fix bug when result of the KEEP function was dependent on source object
Oct 14, 2018
ae7daad
some more changes in KEEP function
Oct 14, 2018
3f99c77
Merge pull request #6 from 3timeslazy/feature/#10_keep
Oct 14, 2018
5dce150
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 14, 2018
4f9fc39
Merge branch 'master' of https://github.com/3timeslazy/ferret
Oct 14, 2018
90bce76
init VALUES function
Oct 15, 2018
e8681af
push test with bug
Oct 15, 2018
22aa468
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 16, 2018
7e3d774
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 16, 2018
647bca4
add stress test
Oct 16, 2018
a31e5d2
small changes in stress tests
Oct 19, 2018
db70932
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 19, 2018
fcf3de8
changes in object.Comapare
Oct 21, 2018
f43d9ed
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 21, 2018
a4a3b3b
change object.Compare
Oct 22, 2018
0a9c7e8
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Oct 22, 2018
24e0755
add more tests for object.Compare
Oct 22, 2018
eff5501
added comments to object.Compare function
Oct 22, 2018
bd24a67
change object.Comapare
Oct 22, 2018
f41d6bb
delete useless comment
Oct 22, 2018
657e973
one more change in object.Compare
Oct 22, 2018
040922b
Merge pull request #7 from 3timeslazy/feature/#10_values
Oct 22, 2018
244da6d
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 26, 2018
b0e2c06
init datetime
Oct 30, 2018
6f82025
added test for datetime
Oct 30, 2018
09546ae
added lib.go
Oct 30, 2018
d870798
add helpers functions
Oct 31, 2018
1cb998e
made values.DefaultTimeLayout public
Oct 31, 2018
f3b1372
added DATE function
Oct 31, 2018
f5b7cb9
added DATE_DAYOFWEEK function
Oct 31, 2018
db2ab4b
added DATE_YEAR function
Oct 31, 2018
a011eda
Merge branch 'master' of https://github.com/MontFerret/ferret
Oct 31, 2018
dcf4f2f
merge
Oct 31, 2018
c5328e0
merge with MontFerre/ferret master
Oct 31, 2018
91c10ce
added DATE_MONTH function
Nov 1, 2018
a73793a
added one more testCase for DATE_MONTH
Nov 1, 2018
efc53b6
added DATE_DAY function
Nov 1, 2018
9ae57f4
merge
Nov 1, 2018
e60f23d
added DateDay to lib
Nov 1, 2018
b37fdb1
Merge pull request #8 from 3timeslazy/feature/#8_datetime
Nov 2, 2018
a998edc
added DATE_HOUR, DATE_MINUTE and DATE_SECOND functions
Nov 4, 2018
12fb756
merge with MontFerret/ferret master
Nov 4, 2018
95eb075
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Nov 4, 2018
9dc392d
added DATE_DAYOFYEAR, DATE_LEAPYEAR, DATE_MILLISECOND functions
Nov 4, 2018
ef033e9
fix names in tests
Nov 4, 2018
b5e79e7
one more case into dayofyear_test
Nov 4, 2018
c6c88e1
added DATE_QUARTER function
Nov 4, 2018
b8a4032
added DATE_DAYS_IN_MONTH function
Nov 4, 2018
f249a59
added DATE_FORMAT function
Nov 4, 2018
2ff03ed
added -v flag into go test
Nov 5, 2018
23676c9
update DATE_FORMAT test cases
Nov 5, 2018
d52893a
added one more test case
Nov 5, 2018
6f622c9
Merge pull request #9 from 3timeslazy/feature/#8_datetime
Nov 5, 2018
b5521af
merge with MontFerret/ferret master
Nov 5, 2018
94dc1c6
add helpers functions
Oct 31, 2018
c2bae87
made values.DefaultTimeLayout public
Oct 31, 2018
d0172ed
added DATE function
Oct 31, 2018
86bcda7
added DATE_DAYOFWEEK function
Oct 31, 2018
de0c703
added DATE_YEAR function
Oct 31, 2018
bd7378d
added DATE_MONTH function
Nov 1, 2018
6d6591e
added one more testCase for DATE_MONTH
Nov 1, 2018
d027d3f
added DATE_DAY function
Nov 1, 2018
9725975
added DateDay to lib
Nov 1, 2018
0637fb0
added DATE_HOUR, DATE_MINUTE and DATE_SECOND functions
Nov 4, 2018
b79ab02
added DATE_DAYOFYEAR, DATE_LEAPYEAR, DATE_MILLISECOND functions
Nov 4, 2018
42fd22a
fix names in tests
Nov 4, 2018
4224b9f
one more case into dayofyear_test
Nov 4, 2018
0a43c22
added DATE_QUARTER function
Nov 4, 2018
d9292ea
added DATE_DAYS_IN_MONTH function
Nov 4, 2018
e71399c
added DATE_FORMAT function
Nov 4, 2018
6fa267e
added -v flag into go test
Nov 5, 2018
4937548
Set codecov support for all branches
ziflex Nov 5, 2018
d875c55
update DATE_FORMAT test cases
Nov 5, 2018
2e54e8c
Updated codecov settings
ziflex Nov 5, 2018
c34b852
Added panic recovery mechanism (#158)
ziflex Nov 5, 2018
a2bd798
Bump github.com/mafredri/cdp from 0.19.0 to 0.20.0 (#159)
dependabot[bot] Nov 5, 2018
5142705
Bump github.com/gofrs/uuid from 3.1.1 to 3.1.2 (#160)
dependabot[bot] Nov 5, 2018
e5d0d4c
added one more test case
Nov 5, 2018
34c3df1
rebase
Nov 5, 2018
b531faa
Merge branch 'feature/#8_datetime' of https://github.com/3timeslazy/f…
Nov 5, 2018
c6ab8e1
Merge branch 'master' of https://github.com/MontFerret/ferret
Nov 5, 2018
f973f40
merge
Nov 5, 2018
431e3b8
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Nov 5, 2018
4794266
sorter instead Compare now
Nov 5, 2018
23b85ce
Merge pull request #10 from 3timeslazy/feature/#8_datetime
Nov 5, 2018
a94ca6e
rename utils.LOG -> utils.PRINT
Nov 5, 2018
b212b06
rename utils.Logs -> utils.Print
Nov 5, 2018
980735a
Merge pull request #11 from 3timeslazy/feature/PRINT
Nov 5, 2018
30683aa
Merge branch 'master' of https://github.com/MontFerret/ferret
Nov 6, 2018
0d0c4f3
added DATE_ADD, DATE_SUBTRACT functions
Nov 6, 2018
5bb54fd
Merge pull request #12 from 3timeslazy/feature/#8_date_add_subtract
Nov 6, 2018
89033df
use keyed fields now
Nov 7, 2018
72d721f
added DATE_DIFF function
Nov 13, 2018
6c100b9
Merge branch 'master' of https://github.com/MontFerret/ferret into fe…
Nov 13, 2018
6452849
delete unused var
Nov 13, 2018
5f34deb
delete useless type cast
Nov 13, 2018
25b535f
fixed a bug when adding/subtrating did not take an amount of units
Nov 18, 2018
5f57958
added DateCompare function
Nov 19, 2018
9ba7527
merge with MontFerret/master
Nov 19, 2018
f5da934
renames
Nov 19, 2018
c41a535
Merge branch 'master' of https://github.com/MontFerret/ferret
Nov 19, 2018
e702d90
merge
Nov 19, 2018
f7d12ba
Merge pull request #13 from 3timeslazy/feature/#8_date_diff
Nov 19, 2018
0712509
Merge pull request #14 from 3timeslazy/feature/#8_date_add_subtract
Nov 19, 2018
7415694
Merge pull request #15 from 3timeslazy/bugfix/add_subtract
Nov 19, 2018
0ebae3b
Merge branch 'master' of https://github.com/3timeslazy/ferret into fe…
Nov 19, 2018
6dc041b
fix small bug
Nov 19, 2018
8eec650
fix
Nov 19, 2018
cc7b05b
Merge branch 'master' of https://github.com/3timeslazy/ferret
Nov 19, 2018
9d3b372
fix
Nov 19, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 8 additions & 29 deletions pkg/stdlib/datetime/add_subtract.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@ package datetime

import (
"context"
"strings"
"time"

"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/pkg/errors"
)

var (
Expand Down Expand Up @@ -40,12 +37,14 @@ func DateAdd(_ context.Context, args ...core.Value) (core.Value, error) {
return values.None, err
}

dt, err := addUnit(date, int(amount), unit.String())
u, err := UnitFromString(unit.String())
if err != nil {
return values.None, err
}

return dt, nil
tm := AddUnit(date.Time, int(amount), u)

return values.NewDateTime(tm), nil
}

// DateSubtract subtract amount given in unit to date.
Expand All @@ -68,12 +67,14 @@ func DateSubtract(_ context.Context, args ...core.Value) (core.Value, error) {
return values.None, err
}

dt, err := addUnit(date, -1*int(amount), unit.String())
u, err := UnitFromString(unit.String())
if err != nil {
return values.None, err
}

return dt, nil
tm := AddUnit(date.Time, -1*int(amount), u)

return values.NewDateTime(tm), nil
}

func getArgs(args []core.Value) (values.DateTime, values.Int, values.String, error) {
Expand All @@ -97,25 +98,3 @@ func getArgs(args []core.Value) (values.DateTime, values.Int, values.String, err

return date, amount, unit, nil
}

func addUnit(dt values.DateTime, amount int, unit string) (values.DateTime, error) {
switch strings.ToLower(unit) {
case "y", "year", "years":
return values.NewDateTime(dt.AddDate(amount*1, 0, 0)), nil
case "m", "month", "months":
return values.NewDateTime(dt.AddDate(0, amount*1, 0)), nil
case "w", "week", "weeks":
return values.NewDateTime(dt.AddDate(0, 0, amount*7)), nil
case "d", "day", "days":
return values.NewDateTime(dt.AddDate(0, 0, amount*1)), nil
case "h", "hour", "hours":
return values.NewDateTime(dt.Add(time.Duration(amount) * time.Hour)), nil
case "i", "minute", "minutes":
return values.NewDateTime(dt.Add(time.Duration(amount) * time.Minute)), nil
case "s", "second", "seconds":
return values.NewDateTime(dt.Add(time.Duration(amount) * time.Second)), nil
case "f", "millisecond", "milliseconds":
return values.NewDateTime(dt.Add(time.Duration(amount) * time.Millisecond)), nil
}
return values.DateTime{}, errors.Errorf("no such unit '%s'", unit)
}
66 changes: 66 additions & 0 deletions pkg/stdlib/datetime/compare.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package datetime

import (
"github.com/pkg/errors"

"context"

"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
)

// DateCompare check if two partial dates match.
// @params date1, date2 (DateTime) - comparable dates.
// @params unitRangeStart (String) - unit to start from.
// @params unitRangeEnd (String, Optional) - unit to end with.
// Error will be returned if unitRangeStart unit less that unitRangeEnd.
// @return (Boolean) - true if the dates match, else false.
func DateCompare(_ context.Context, args ...core.Value) (core.Value, error) {
err := core.ValidateArgs(args, 3, 4)
if err != nil {
return values.None, err
}

err = core.ValidateValueTypePairs(
core.PairValueType{Value: args[0], Types: sliceDateTime},
core.PairValueType{Value: args[1], Types: sliceDateTime},
core.PairValueType{Value: args[2], Types: sliceStringType},
)
if err != nil {
return values.None, err
}

date1 := args[0].(values.DateTime)
date2 := args[1].(values.DateTime)
rangeStart := args[2].(values.String)
rangeEnd := values.NewString("millisecond")

if len(args) == 4 {
if err = core.ValidateType(args[3], core.StringType); err != nil {
return values.None, err
}
rangeEnd = args[3].(values.String)
}

unitStart, err := UnitFromString(rangeStart.String())
if err != nil {
return values.None, err
}

unitEnd, err := UnitFromString(rangeEnd.String())
if err != nil {
return values.None, err
}

if unitStart < unitEnd {
return values.None, errors.Errorf("start unit less that end unit")
}

for u := unitEnd; u <= unitStart; u++ {
if IsDatesEqual(date1.Time, date2.Time, u) {
return values.NewBoolean(true), nil
}
}

return values.NewBoolean(false), nil
}
107 changes: 107 additions & 0 deletions pkg/stdlib/datetime/compare_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package datetime_test

import (
"testing"

"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/MontFerret/ferret/pkg/stdlib/datetime"
)

func TestDateCompare(t *testing.T) {
expectedTrue := values.NewBoolean(true)
expectedFalse := values.NewBoolean(false)

tcs := []*testCase{
&testCase{
Name: "When less than 3 arguments",
Expected: values.None,
Args: []core.Value{values.NewInt(0), values.NewInt(0)},
ShouldErr: true,
},
&testCase{
Name: "When more than 4 arguments",
Expected: values.None,
Args: []core.Value{
values.NewInt(0), values.NewInt(0), values.NewInt(0),
values.NewInt(0), values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "when wrong type of arguments",
Expected: values.None,
Args: []core.Value{
values.NewCurrentDateTime(),
values.NewCurrentDateTime(),
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "when wrong type of optional argument",
Expected: values.None,
Args: []core.Value{
values.NewCurrentDateTime(),
values.NewCurrentDateTime(),
values.NewString("year"),
values.NewInt(0),
},
ShouldErr: true,
},
&testCase{
Name: "when start unit less that end unit",
Expected: values.None,
Args: []core.Value{
values.NewCurrentDateTime(),
values.NewCurrentDateTime(),
values.NewString("day"),
values.NewString("year"),
},
ShouldErr: true,
},
&testCase{
Name: "when years are equal",
Expected: expectedTrue,
Args: []core.Value{
values.NewCurrentDateTime(),
values.NewCurrentDateTime(),
values.NewString("year"),
},
},
&testCase{
Name: "when years are not equal",
Expected: expectedFalse,
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
mustLayoutDt("2006-01-02", "2000-02-07"),
values.NewString("year"),
values.NewString("year"),
},
},
&testCase{
Name: "when months are equal",
Expected: expectedTrue,
Args: []core.Value{
mustLayoutDt("2006-01-02", "1999-02-07"),
mustLayoutDt("2006-01-02", "2000-02-09"),
values.NewString("year"),
values.NewString("days"),
},
},
&testCase{
Name: "when days are equal",
Expected: expectedTrue,
Args: []core.Value{
values.NewCurrentDateTime(),
values.NewCurrentDateTime(),
values.NewString("days"),
values.NewString("days"),
},
},
}

for _, tc := range tcs {
tc.Do(t, datetime.DateCompare)
}
}
24 changes: 4 additions & 20 deletions pkg/stdlib/datetime/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@ package datetime

import (
"context"
"strings"

"github.com/MontFerret/ferret/pkg/runtime/core"
"github.com/MontFerret/ferret/pkg/runtime/values"
"github.com/pkg/errors"
)

// DateDiff returns the difference between two dates in given time unit.
Expand Down Expand Up @@ -71,23 +69,9 @@ func DateDiff(_ context.Context, args ...core.Value) (core.Value, error) {
}

func nsecToUnit(nsec float64, unit string) (float64, error) {
switch strings.ToLower(unit) {
case "y", "year", "years":
return nsec / 31536e12, nil
case "m", "month", "months":
return nsec / 26784e11, nil
case "w", "week", "weeks":
return nsec / 6048e11, nil
case "d", "day", "days":
return nsec / 864e11, nil
case "h", "hour", "hours":
return nsec / 36e11, nil
case "i", "minute", "minutes":
return nsec / 6e10, nil
case "s", "second", "seconds":
return nsec / 1e9, nil
case "f", "millisecond", "milliseconds":
return nsec / 1e6, nil
u, err := UnitFromString(unit)
if err != nil {
return -1, err
}
return -1, errors.Errorf("no such unit '%s'", unit)
return nsec / u.Nanosecond(), nil
}
Loading