Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions docs/changelog/113297.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 113297
summary: "[ES|QL] add reverse function"
area: ES|QL
type: enhancement
issues: []
5 changes: 5 additions & 0 deletions docs/reference/esql/functions/description/reverse.asciidoc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 22 additions & 0 deletions docs/reference/esql/functions/examples/reverse.asciidoc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 38 additions & 0 deletions docs/reference/esql/functions/kibana/definition/reverse.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions docs/reference/esql/functions/kibana/docs/reverse.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions docs/reference/esql/functions/layout/reverse.asciidoc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions docs/reference/esql/functions/parameters/reverse.asciidoc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions docs/reference/esql/functions/signature/reverse.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions docs/reference/esql/functions/string-functions.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
* <<esql-ltrim>>
* <<esql-repeat>>
* <<esql-replace>>
* <<esql-reverse>>
* <<esql-right>>
* <<esql-rtrim>>
* <<esql-space>>
Expand All @@ -38,6 +39,7 @@ include::layout/locate.asciidoc[]
include::layout/ltrim.asciidoc[]
include::layout/repeat.asciidoc[]
include::layout/replace.asciidoc[]
include::layout/reverse.asciidoc[]
include::layout/right.asciidoc[]
include::layout/rtrim.asciidoc[]
include::layout/space.asciidoc[]
Expand Down
10 changes: 10 additions & 0 deletions docs/reference/esql/functions/types/reverse.asciidoc

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions server/src/main/java/org/elasticsearch/common/util/ArrayUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,20 @@ public static void reverseSubArray(long[] array, int offset, int length) {
end--;
}
}

/**
* Reverse the {@code length} values on the array starting from {@code offset}.
*/
public static void reverseArray(byte[] array, int offset, int length) {
int start = offset;
int end = offset + length;
while (start < end) {
final byte temp = array[start];
array[start] = array[end - 1];
array[end - 1] = temp;
start++;
end--;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ double pi()
"double pow(base:double|integer|long|unsigned_long, exponent:double|integer|long|unsigned_long)"
"keyword repeat(string:keyword|text, number:integer)"
"keyword replace(string:keyword|text, regex:keyword|text, newString:keyword|text)"
"keyword|text reverse(str:keyword|text)"
"keyword right(string:keyword|text, length:integer)"
"double|integer|long|unsigned_long round(number:double|integer|long|unsigned_long, ?decimals:integer)"
"keyword|text rtrim(string:keyword|text)"
Expand Down Expand Up @@ -201,6 +202,7 @@ pi |null |null
pow |[base, exponent] |["double|integer|long|unsigned_long", "double|integer|long|unsigned_long"] |["Numeric expression for the base. If `null`\, the function returns `null`.", "Numeric expression for the exponent. If `null`\, the function returns `null`."]
repeat |[string, number] |["keyword|text", integer] |[String expression., Number times to repeat.]
replace |[string, regex, newString] |["keyword|text", "keyword|text", "keyword|text"] |[String expression., Regular expression., Replacement string.]
reverse |str |"keyword|text" |String expression. If `null`, the function returns `null`.
right |[string, length] |["keyword|text", integer] |[The string from which to returns a substring., The number of characters to return.]
round |[number, decimals] |["double|integer|long|unsigned_long", integer] |["The numeric value to round. If `null`\, the function returns `null`.", "The number of decimal places to round to. Defaults to 0. If `null`\, the function returns `null`."]
rtrim |string |"keyword|text" |String expression. If `null`, the function returns `null`.
Expand Down Expand Up @@ -333,6 +335,7 @@ pi |Returns {wikipedia}/Pi[Pi], the ratio of a circle's circumference
pow |Returns the value of `base` raised to the power of `exponent`.
repeat |Returns a string constructed by concatenating `string` with itself the specified `number` of times.
replace |The function substitutes in the string `str` any match of the regular expression `regex` with the replacement string `newStr`.
reverse |Returns a new string representing the input string in reverse order.
right |Return the substring that extracts 'length' chars from 'str' starting from the right.
round |Rounds a number to the specified number of decimal places. Defaults to 0, which returns the nearest integer. If the precision is a negative number, rounds to the number of digits left of the decimal point.
rtrim |Removes trailing whitespaces from a string.
Expand Down Expand Up @@ -467,6 +470,7 @@ pi |double
pow |double |[false, false] |false |false
repeat |keyword |[false, false] |false |false
replace |keyword |[false, false, false] |false |false
reverse |"keyword|text" |false |false |false
right |keyword |[false, false] |false |false
round |"double|integer|long|unsigned_long" |[false, true] |false |false
rtrim |"keyword|text" |false |false |false
Expand Down Expand Up @@ -544,5 +548,5 @@ required_capability: meta
meta functions | stats a = count(*), b = count(*), c = count(*) | mv_expand c;

a:long | b:long | c:long
121 | 121 | 121
122 | 122 | 122
;
107 changes: 107 additions & 0 deletions x-pack/plugin/esql/qa/testFixtures/src/main/resources/string.csv-spec
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,113 @@ a:keyword | upper:keyword | lower:keyword
π/2 + a + B + Λ ºC | Π/2 + A + B + Λ ºC | π/2 + a + b + λ ºc
;

reverse
required_capability: fn_reverse
from employees | sort emp_no | eval name_reversed = REVERSE(first_name) | keep emp_no, first_name, name_reversed | limit 1;

emp_no:integer | first_name:keyword | name_reversed:keyword
10001 | Georgi | igroeG
;

reverseRow
required_capability: fn_reverse
// tag::reverse[]
ROW message = "Some Text" | EVAL message_reversed = REVERSE(message);
// end::reverse[]

// tag::reverse-result[]
message:keyword | message_reversed:keyword
Some Text | txeT emoS
// end::reverse-result[]
;

reverseEmoji
required_capability: fn_reverse
// tag::reverseEmoji[]
ROW bending_arts = "💧🪨🔥💨" | EVAL bending_arts_reversed = REVERSE(bending_arts);
// end::reverseEmoji[]

// tag::reverseEmoji-result[]
bending_arts:keyword | bending_arts_reversed:keyword
💧🪨🔥💨 | 💨🔥🪨💧
// end::reverseEmoji-result[]
;

reverseEmoji2
required_capability: fn_reverse
ROW off_on_holiday = "🏠➡️🚌➡️✈️➡️🏝️" | EVAL back_home_again = REVERSE(off_on_holiday);

off_on_holiday:keyword | back_home_again:keyword
🏠➡️🚌➡️✈️➡️🏝️ | 🏝️➡️✈️➡️🚌➡️🏠
;

reverseGraphemeClusters
required_capability: fn_reverse
ROW message = "áéíóúàèìòùâêîôû😊👍🏽🎉💖कंठाी" | EVAL message_reversed = REVERSE(message);

message:keyword | message_reversed:keyword
áéíóúàèìòùâêîôû😊👍🏽🎉💖कंठाी | ठाीकं💖🎉👍🏽😊ûôîêâùòìèàúóíéá
;

reverseMultiValue
required_capability: fn_reverse
FROM employees | SORT emp_no | EVAL jobs_reversed = REVERSE(job_positions) | KEEP job*, emp_no | LIMIT 5;

warning:Line 1:53: evaluation of [REVERSE(job_positions)] failed, treating result as null. Only first 20 failures recorded.
warning:Line 1:53: java.lang.IllegalArgumentException: single-value function encountered multi-value

job_positions:keyword | jobs_reversed:keyword | emp_no:integer
["Accountant", "Senior Python Developer"] | null | 10001
Senior Team Lead | daeL maeT roineS | 10002
null | null | 10003
[Head Human Resources, Reporting Analyst, Support Engineer, Tech Lead] | null | 10004
null | null | 10005
;

reverseNested
required_capability: fn_reverse
FROM employees | SORT emp_no | EVAL name_reversed = REVERSE(REVERSE(first_name)), eq = name_reversed == first_name | KEEP first_name, name_reversed, eq, emp_no | LIMIT 5;

first_name:keyword | name_reversed:keyword | eq:boolean | emp_no:integer
Georgi | Georgi | true | 10001
Bezalel | Bezalel | true | 10002
Parto | Parto | true | 10003
Chirstian | Chirstian | true | 10004
Kyoichi | Kyoichi | true | 10005
;

reverseRowNull
required_capability: fn_reverse
ROW x = null | EVAL y = REVERSE(x);

x:null | y:null
null | null
;


reverseRowInlineCastWithNull
required_capability: fn_reverse
ROW x = 1 | EVAL y = REVERSE((null + 1)::string);

x:integer | y:string
1 | null
;

reverseWithTextFields
required_capability: fn_reverse
FROM books
| EVAL title_reversed = REVERSE(title), author_reversed_twice = REVERSE(REVERSE(author)), eq = author_reversed_twice == author
| KEEP title, title_reversed, author, author_reversed_twice, eq, book_no
| SORT book_no
| WHERE book_no IN ("1211", "1463")
| LIMIT 2;

title:text | title_reversed:text | author:text | author_reversed_twice:text | eq:boolean | book_no:keyword
The brothers Karamazov | vozamaraK srehtorb ehT | Fyodor Dostoevsky | Fyodor Dostoevsky | true | 1211
Realms of Tolkien: Images of Middle-earth | htrae-elddiM fo segamI :neikloT fo smlaeR | J. R. R. Tolkien | J. R. R. Tolkien | true | 1463
;


values
required_capability: agg_values

Expand Down
Loading