diff --git a/query/common_test.go b/query/common_test.go index 85fd5f2ed8f..7da0ddfd092 100644 --- a/query/common_test.go +++ b/query/common_test.go @@ -251,6 +251,7 @@ make : string @index(term) . year : int . previous_model : uid @reverse . created_at : datetime @index(hour) . +updated_at : datetime @index(year) . ` func populateCluster() { @@ -344,9 +345,9 @@ func populateCluster() { <31> <24> . <23> <1> . - <2> <64> . - <3> <64> . - <4> <64> . + <2> <64> (since=2019-03-28T14:41:57+30:00) . + <3> <64> (since=2018-03-24T14:41:57+05:30) . + <4> <64> (since=2019-03-27) . <1> "38" . <23> "15" . @@ -574,12 +575,20 @@ func populateCluster() { // Add data for datetime tests addTriplesToCluster(` - <301> "2019-03-28T14:41:57+30:00" . - <302> "2019-03-28T13:41:57+29:00" . - <303> "2019-03-27T14:41:57+06:00" . - <304> "2019-03-28T15:41:57+30:00" . - <305> "2019-03-28T13:41:57+30:00" . - <306> "2019-03-24T14:41:57+05:30" . + <301> "2019-03-28T14:41:57+30:00" (modified_at=2019-05-28T14:41:57+30:00) . + <302> "2019-03-28T13:41:57+29:00" (modified_at=2019-03-28T14:41:57+30:00) . + <303> "2019-03-27T14:41:57+06:00" (modified_at=2019-03-29) . + <304> "2019-03-28T15:41:57+30:00" (modified_at=2019-03-27T14:41:57+06:00) . + <305> "2019-03-28T13:41:57+30:00" (modified_at=2019-03-28) . + <306> "2019-03-24T14:41:57+05:30" (modified_at=2019-03-28T13:41:57+30:00) . <307> "2019-05-28T14:41:57+30:00" . + + <301> "2019-03-28T14:41:57+30:00" (modified_at=2019-05-28) . + <302> "2019-03-28T13:41:57+29:00" (modified_at=2019-03-28T14:41:57+30:00) . + <303> "2019-03-27T14:41:57+06:00" (modified_at=2019-03-28T13:41:57+29:00) . + <304> "2019-03-28T15:41:57+30:00" . + <305> "2019-03-28T13:41:57+30:00" (modified_at=2019-03-28T15:41:57+30:00) . + <306> "2019-03-24T14:41:57+05:30" (modified_at=2019-03-28T13:41:57+30:00) . + <307> "2019-05-28T14:41:57+30:00" (modified_at=2019-03-24T14:41:57+05:30) . `) } diff --git a/query/query0_test.go b/query/query0_test.go index 8be21e1a84e..be46d5c0171 100644 --- a/query/query0_test.go +++ b/query/query0_test.go @@ -17,6 +17,7 @@ package query import ( + "fmt" "os" "testing" @@ -1824,34 +1825,276 @@ func TestNonFlattenedResponse(t *testing.T) { } -func TestDateTimeQuery1(t *testing.T) { - query := ` - { - q(func: ge(created_at, "2019-03-28T13:41:57")) { +func TestDateTimeQuery(t *testing.T) { + var query string + + // Test 20 + query = ` +{ + q(func: has(best_friend)){ + uid + best_friend @facets(orderasc: since) { uid - created_at } - } - ` - js := processQueryNoErr(t, query) + } +} +` + fmt.Println(processQueryNoErr(t, query)) require.JSONEq(t, - `{"data":{"q":[{"uid":"0x133","created_at":"2019-05-28T14:41:57+30:00"}]}}`, - js) + `{"data":{"q":[{"uid":"0x2","best_friend":{"uid":"0x40","best_friend|since":"2019-03-28T14:41:57+30:00"}},{"uid":"0x4","best_friend":{"uid":"0x40","best_friend|since":"2019-03-27T00:00:00Z"}},{"uid":"0x3","best_friend":{"uid":"0x40","best_friend|since":"2018-03-24T14:41:57+05:30"}}]}}`, + processQueryNoErr(t, query)) + + // Test 19 + query = ` +{ + q(func: has(created_at), orderdesc: created_at) { + uid + created_at + } } +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x133","created_at":"2019-05-28T14:41:57+30:00"},{"uid":"0x130","created_at":"2019-03-28T15:41:57+30:00"},{"uid":"0x12d","created_at":"2019-03-28T14:41:57+30:00"},{"uid":"0x12e","created_at":"2019-03-28T13:41:57+29:00"},{"uid":"0x12f","created_at":"2019-03-27T14:41:57+06:00"},{"uid":"0x131","created_at":"2019-03-28T13:41:57+30:00"},{"uid":"0x132","created_at":"2019-03-24T14:41:57+05:30"}]}}`, + processQueryNoErr(t, query)) -func TestDateTimeQuery2(t *testing.T) { - query := ` + // Test 18 + query = ` +{ + q(func: has(best_friend)) @cascade { + uid + best_friend @facets(lt(since, "2019-03-24")) @facets(since) { + uid + } + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x3","best_friend":{"uid":"0x40","best_friend|since":"2018-03-24T14:41:57+05:30"}}]}}`, + processQueryNoErr(t, query)) + + // Test 17 + query = ` +{ + q(func: has(best_friend)) @cascade { + uid + best_friend @facets(gt(since, "2019-03-27")) @facets(since) { + uid + } + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x2","best_friend":{"uid":"0x40","best_friend|since":"2019-03-28T14:41:57+30:00"}}]}}`, + processQueryNoErr(t, query)) + + // Test 16 + query = ` +{ + q(func: gt(created_at, "2019-03-28")) { + uid + created_at @facets(modified_at) + updated_at @facets(modified_at) + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x133","created_at":"2019-05-28T14:41:57+30:00","updated_at|modified_at":"2019-03-24T14:41:57+05:30","updated_at":"2019-05-28T14:41:57+30:00"}]}}`, + processQueryNoErr(t, query)) + + // Test 15 + query = ` +{ + q(func: gt(age, 15)) @filter(gt(graduation, "1932") AND lt(graduation, "1934")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x1f","graduation":["1935-01-01T00:00:00Z","1933-01-01T00:00:00Z"]}]}}`, + processQueryNoErr(t, query)) + + // Test 14 + query = ` +{ + q(func: gt(age, 15)) @filter(le(graduation, "1932") OR gt(graduation, "1936")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x1","graduation":["1932-01-01T00:00:00Z"]}]}}`, + processQueryNoErr(t, query)) + + // Test 13 + query = ` { - q(func: ge(created_at, "2019-03-28T13:41:57+00:00")) { + q(func: gt(age, 15)) @filter(lt(graduation, "1932") AND gt(graduation, "1936")) { uid - created_at + graduation } - } + } ` - js := processQueryNoErr(t, query) + require.JSONEq(t, + `{"data":{"q":[]}}`, + processQueryNoErr(t, query)) + + // Test 12 + query = ` +{ + q(func: le(dob, "1909-05-05")) { + uid + dob + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x18","dob":"1909-05-05T00:00:00Z"},{"uid":"0x19","dob":"1909-01-10T00:00:00Z"},{"uid":"0x1f","dob":"1901-01-15T00:00:00Z"}]}}`, + processQueryNoErr(t, query)) + + // Test 11 + query = ` +{ + q(func: le(dob, "1909-05-05T00:00:00+05:30")) { + uid + dob + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x19","dob":"1909-01-10T00:00:00Z"},{"uid":"0x1f","dob":"1901-01-15T00:00:00Z"}]}}`, + processQueryNoErr(t, query)) + + // Test 10 + query = ` +{ + q(func: eq(graduation, "1932-01-01T00:00:00+05:30")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[]}}`, + processQueryNoErr(t, query)) + + // Test 9 + query = ` +{ + q(func: eq(graduation, "1932")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x1","graduation":["1932-01-01T00:00:00Z"]}]}}`, + processQueryNoErr(t, query)) + + // Test 8 + query = ` +{ + q(func: lt(graduation, "1933")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x1","graduation":["1932-01-01T00:00:00Z"]}]}}`, + processQueryNoErr(t, query)) + + // Test 7 + query = ` +{ + q(func: gt(graduation, "1932")) { + uid + graduation + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x1f","graduation":["1935-01-01T00:00:00Z","1933-01-01T00:00:00Z"]}]}}`, + processQueryNoErr(t, query)) + + // Test 6 + query = ` +{ + q(func: le(updated_at, "2019-03-27T14:41:56+06:00")) { + uid + updated_at + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x131","updated_at":"2019-03-28T13:41:57+30:00"},{"uid":"0x132","updated_at":"2019-03-24T14:41:57+05:30"}]}}`, + processQueryNoErr(t, query)) + + // Test 5 + query = ` +{ + q(func: ge(updated_at, "2019-03-28T13:41:57+00:00")) { + uid + updated_at + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x133","updated_at":"2019-05-28T14:41:57+30:00"}]}}`, + processQueryNoErr(t, query)) + + // Test 4 + query = ` +{ + q(func: ge(updated_at, "2019-03-28T13:41:57")) { + uid + updated_at + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x133","updated_at":"2019-05-28T14:41:57+30:00"}]}}`, + processQueryNoErr(t, query)) + + // Test 3 + query = ` +{ + q(func: le(created_at, "2019-03-27T14:41:56+06:00")) { + uid + created_at + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x131","created_at":"2019-03-28T13:41:57+30:00"},{"uid":"0x132","created_at":"2019-03-24T14:41:57+05:30"}]}}`, + processQueryNoErr(t, query)) + + // Test 2 + query = ` +{ + q(func: ge(created_at, "2019-03-28T13:41:57+00:00")) { + uid + created_at + } +} +` require.JSONEq(t, `{"data":{"q":[{"uid":"0x133","created_at":"2019-05-28T14:41:57+30:00"}]}}`, - js) + processQueryNoErr(t, query)) + + // Test 1 + query = ` +{ + q(func: ge(created_at, "2019-03-28T13:41:57")) { + uid + created_at + } +} +` + require.JSONEq(t, + `{"data":{"q":[{"uid":"0x133","created_at":"2019-05-28T14:41:57+30:00"}]}}`, + processQueryNoErr(t, query)) } var client *dgo.Dgraph diff --git a/tok/tok.go b/tok/tok.go index 62e62c004ad..e62399c1a4f 100644 --- a/tok/tok.go +++ b/tok/tok.go @@ -208,7 +208,7 @@ func (t YearTokenizer) Type() string { return "datetime" } func (t YearTokenizer) Tokens(v interface{}) ([]string, error) { tval := v.(time.Time) buf := make([]byte, 2) - binary.BigEndian.PutUint16(buf[0:2], uint16(tval.Year())) + binary.BigEndian.PutUint16(buf[0:2], uint16(tval.UTC().Year())) return []string{string(buf)}, nil } func (t YearTokenizer) Identifier() byte { return IdentYear } @@ -222,8 +222,8 @@ func (t MonthTokenizer) Type() string { return "datetime" } func (t MonthTokenizer) Tokens(v interface{}) ([]string, error) { tval := v.(time.Time) buf := make([]byte, 4) - binary.BigEndian.PutUint16(buf[0:2], uint16(tval.Year())) - binary.BigEndian.PutUint16(buf[2:4], uint16(tval.Month())) + binary.BigEndian.PutUint16(buf[0:2], uint16(tval.UTC().Year())) + binary.BigEndian.PutUint16(buf[2:4], uint16(tval.UTC().Month())) return []string{string(buf)}, nil } func (t MonthTokenizer) Identifier() byte { return IdentMonth } @@ -237,9 +237,9 @@ func (t DayTokenizer) Type() string { return "datetime" } func (t DayTokenizer) Tokens(v interface{}) ([]string, error) { tval := v.(time.Time) buf := make([]byte, 6) - binary.BigEndian.PutUint16(buf[0:2], uint16(tval.Year())) - binary.BigEndian.PutUint16(buf[2:4], uint16(tval.Month())) - binary.BigEndian.PutUint16(buf[4:6], uint16(tval.Day())) + binary.BigEndian.PutUint16(buf[0:2], uint16(tval.UTC().Year())) + binary.BigEndian.PutUint16(buf[2:4], uint16(tval.UTC().Month())) + binary.BigEndian.PutUint16(buf[4:6], uint16(tval.UTC().Day())) return []string{string(buf)}, nil } func (t DayTokenizer) Identifier() byte { return IdentDay } @@ -253,10 +253,10 @@ func (t HourTokenizer) Type() string { return "datetime" } func (t HourTokenizer) Tokens(v interface{}) ([]string, error) { tval := v.(time.Time) buf := make([]byte, 8) - binary.BigEndian.PutUint16(buf[0:2], uint16(tval.Year())) - binary.BigEndian.PutUint16(buf[2:4], uint16(tval.Month())) - binary.BigEndian.PutUint16(buf[4:6], uint16(tval.Day())) - binary.BigEndian.PutUint16(buf[6:8], uint16(tval.Hour())) + binary.BigEndian.PutUint16(buf[0:2], uint16(tval.UTC().Year())) + binary.BigEndian.PutUint16(buf[2:4], uint16(tval.UTC().Month())) + binary.BigEndian.PutUint16(buf[4:6], uint16(tval.UTC().Day())) + binary.BigEndian.PutUint16(buf[6:8], uint16(tval.UTC().Hour())) return []string{string(buf)}, nil } func (t HourTokenizer) Identifier() byte { return IdentHour }