|
40 | 40 | import java.io.IOException;
|
41 | 41 | import java.io.InputStream;
|
42 | 42 | import java.nio.charset.StandardCharsets;
|
| 43 | +import java.time.ZoneOffset; |
| 44 | +import java.time.ZonedDateTime; |
| 45 | +import java.time.format.DateTimeFormatter; |
43 | 46 | import java.util.ArrayList;
|
44 | 47 | import java.util.Arrays;
|
45 | 48 | import java.util.Comparator;
|
@@ -786,6 +789,117 @@ && isMillisOrNanos(listOfTypes.get(j))) {
|
786 | 789 | }
|
787 | 790 | }
|
788 | 791 |
|
| 792 | + public void testDateMathIndexPattern() throws IOException { |
| 793 | + ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC); |
| 794 | + |
| 795 | + String[] indices = { |
| 796 | + "test-index-" + DateTimeFormatter.ofPattern("yyyy", Locale.ROOT).format(now), |
| 797 | + "test-index-" + DateTimeFormatter.ofPattern("yyyy", Locale.ROOT).format(now.minusYears(1)), |
| 798 | + "test-index-" + DateTimeFormatter.ofPattern("yyyy", Locale.ROOT).format(now.minusYears(2)) }; |
| 799 | + |
| 800 | + int idx = 0; |
| 801 | + for (String index : indices) { |
| 802 | + createIndex(index); |
| 803 | + for (int i = 0; i < 10; i++) { |
| 804 | + Request request = new Request("POST", "/" + index + "/_doc/"); |
| 805 | + request.addParameter("refresh", "true"); |
| 806 | + request.setJsonEntity("{\"f\":" + idx++ + "}"); |
| 807 | + assertOK(client().performRequest(request)); |
| 808 | + } |
| 809 | + } |
| 810 | + |
| 811 | + String query = """ |
| 812 | + { |
| 813 | + "query": "from <test-index-{now/d{yyyy}}> | sort f asc | limit 1 | keep f" |
| 814 | + } |
| 815 | + """; |
| 816 | + Request request = new Request("POST", "/_query"); |
| 817 | + request.setJsonEntity(query); |
| 818 | + Response resp = client().performRequest(request); |
| 819 | + Map<String, Object> results = entityAsMap(resp); |
| 820 | + List<?> values = (List<?>) results.get("values"); |
| 821 | + assertThat(values.size(), is(1)); |
| 822 | + List<?> row = (List<?>) values.get(0); |
| 823 | + assertThat(row.get(0), is(0)); |
| 824 | + |
| 825 | + query = """ |
| 826 | + { |
| 827 | + "query": "from <test-index-{now/d-1y{yyyy}}> | sort f asc | limit 1 | keep f" |
| 828 | + } |
| 829 | + """; |
| 830 | + request = new Request("POST", "/_query"); |
| 831 | + request.setJsonEntity(query); |
| 832 | + resp = client().performRequest(request); |
| 833 | + results = entityAsMap(resp); |
| 834 | + values = (List<?>) results.get("values"); |
| 835 | + assertThat(values.size(), is(1)); |
| 836 | + row = (List<?>) values.get(0); |
| 837 | + assertThat(row.get(0), is(10)); |
| 838 | + |
| 839 | + for (String index : indices) { |
| 840 | + assertThat(deleteIndex(index).isAcknowledged(), is(true)); // clean up |
| 841 | + } |
| 842 | + } |
| 843 | + |
| 844 | + public void testDateMathInJoin() throws IOException { |
| 845 | + ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC); |
| 846 | + |
| 847 | + createIndex("idx", Settings.EMPTY, """ |
| 848 | + { |
| 849 | + "properties": { |
| 850 | + "key": { |
| 851 | + "type": "keyword" |
| 852 | + } |
| 853 | + } |
| 854 | + } |
| 855 | + """); |
| 856 | + |
| 857 | + Request request = new Request("POST", "/idx/_doc/"); |
| 858 | + request.addParameter("refresh", "true"); |
| 859 | + request.setJsonEntity("{\"key\":\"foo\"}"); |
| 860 | + assertOK(client().performRequest(request)); |
| 861 | + |
| 862 | + String[] lookupIndices = { |
| 863 | + "lookup-index-" + DateTimeFormatter.ofPattern("yyyy", Locale.ROOT).format(now), |
| 864 | + "lookup-index-" + DateTimeFormatter.ofPattern("yyyy", Locale.ROOT).format(now.minusYears(1)) }; |
| 865 | + |
| 866 | + for (String index : lookupIndices) { |
| 867 | + createIndex(index, Settings.builder().put("mode", "lookup").build(), """ |
| 868 | + { |
| 869 | + "properties": { |
| 870 | + "key": { |
| 871 | + "type": "keyword" |
| 872 | + } |
| 873 | + } |
| 874 | + } |
| 875 | + """); |
| 876 | + request = new Request("POST", "/" + index + "/_doc/"); |
| 877 | + request.addParameter("refresh", "true"); |
| 878 | + request.setJsonEntity("{\"key\":\"foo\", \"value\": \"" + index + "\"}"); |
| 879 | + assertOK(client().performRequest(request)); |
| 880 | + } |
| 881 | + |
| 882 | + String[] queries = { |
| 883 | + "from idx | lookup join <lookup-index-{now/d{yyyy}}> on key | limit 1", |
| 884 | + "from idx | lookup join <lookup-index-{now/d-1y{yyyy}}> on key | limit 1" }; |
| 885 | + for (int i = 0; i < queries.length; i++) { |
| 886 | + String queryPayload = "{\"query\": \"" + queries[i] + "\"}"; |
| 887 | + request = new Request("POST", "/_query"); |
| 888 | + request.setJsonEntity(queryPayload); |
| 889 | + Response resp = client().performRequest(request); |
| 890 | + Map<String, Object> results = entityAsMap(resp); |
| 891 | + List<?> values = (List<?>) results.get("values"); |
| 892 | + assertThat(values.size(), is(1)); |
| 893 | + List<?> row = (List<?>) values.get(0); |
| 894 | + assertThat(row.get(1), is(lookupIndices[i])); |
| 895 | + } |
| 896 | + |
| 897 | + assertThat(deleteIndex("idx").isAcknowledged(), is(true)); // clean up |
| 898 | + for (String index : lookupIndices) { |
| 899 | + assertThat(deleteIndex(index).isAcknowledged(), is(true)); // clean up |
| 900 | + } |
| 901 | + } |
| 902 | + |
789 | 903 | static MapMatcher commonProfile() {
|
790 | 904 | return matchesMap() //
|
791 | 905 | .entry("description", any(String.class))
|
|
0 commit comments