This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new ac827abe1b feat: Migrate Map Functions (#13047)
ac827abe1b is described below

commit ac827abe1b66b1dfa02ce65ae857477f68667843
Author: Jonathan Chen <[email protected]>
AuthorDate: Thu Oct 24 07:26:37 2024 -0400

    feat: Migrate Map Functions (#13047)
    
    * add page
    
    * small fixes
    
    * delete md
    
    * Migrate map functions
---
 datafusion/functions-nested/src/map.rs             |  69 +++++++++-
 datafusion/functions-nested/src/map_extract.rs     |  49 ++++++-
 datafusion/functions-nested/src/map_keys.rs        |  41 +++++-
 datafusion/functions-nested/src/map_values.rs      |  41 +++++-
 dev/update_function_docs.sh                        |   1 -
 docs/source/user-guide/sql/scalar_functions.md     | 145 ---------------------
 docs/source/user-guide/sql/scalar_functions_new.md | 144 ++++++++++++++++++++
 7 files changed, 334 insertions(+), 156 deletions(-)

diff --git a/datafusion/functions-nested/src/map.rs 
b/datafusion/functions-nested/src/map.rs
index 29afe4a7f3..d7dce3bacb 100644
--- a/datafusion/functions-nested/src/map.rs
+++ b/datafusion/functions-nested/src/map.rs
@@ -17,7 +17,7 @@
 
 use std::any::Any;
 use std::collections::{HashSet, VecDeque};
-use std::sync::Arc;
+use std::sync::{Arc, OnceLock};
 
 use arrow::array::ArrayData;
 use arrow_array::{Array, ArrayRef, MapArray, OffsetSizeTrait, StructArray};
@@ -27,7 +27,10 @@ use arrow_schema::{DataType, Field, SchemaBuilder};
 use datafusion_common::utils::{fixed_size_list_to_arrays, list_to_arrays};
 use datafusion_common::{exec_err, Result, ScalarValue};
 use datafusion_expr::expr::ScalarFunction;
-use datafusion_expr::{ColumnarValue, Expr, ScalarUDFImpl, Signature, 
Volatility};
+use datafusion_expr::scalar_doc_sections::DOC_SECTION_MAP;
+use datafusion_expr::{
+    ColumnarValue, Documentation, Expr, ScalarUDFImpl, Signature, Volatility,
+};
 
 use crate::make_array::make_array;
 
@@ -238,7 +241,69 @@ impl ScalarUDFImpl for MapFunc {
     fn invoke(&self, args: &[ColumnarValue]) -> Result<ColumnarValue> {
         make_map_batch(args)
     }
+
+    fn documentation(&self) -> Option<&Documentation> {
+        Some(get_map_doc())
+    }
 }
+
+static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+
+fn get_map_doc() -> &'static Documentation {
+    DOCUMENTATION.get_or_init(|| {
+                Documentation::builder()
+                    .with_doc_section(DOC_SECTION_MAP)
+                    .with_description(
+                        "Returns an Arrow map with the specified key-value 
pairs.\n\n\
+                        The `make_map` function creates a map from two lists: 
one for keys and one for values. Each key must be unique and non-null."
+                    )
+                    .with_syntax_example(
+                        "map(key, value)\nmap(key: value)\nmake_map(['key1', 
'key2'], ['value1', 'value2'])"
+                    )
+                    .with_sql_example(
+                        r#"```sql
+        -- Using map function
+        SELECT MAP('type', 'test');
+        ----
+        {type: test}
+        
+        SELECT MAP(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
+        ----
+        {POST: 41, HEAD: 33, PATCH: }
+        
+        SELECT MAP([[1,2], [3,4]], ['a', 'b']);
+        ----
+        {[1, 2]: a, [3, 4]: b}
+        
+        SELECT MAP { 'a': 1, 'b': 2 };
+        ----
+        {a: 1, b: 2}
+        
+        -- Using make_map function
+        SELECT MAKE_MAP(['POST', 'HEAD'], [41, 33]);
+        ----
+        {POST: 41, HEAD: 33}
+        
+        SELECT MAKE_MAP(['key1', 'key2'], ['value1', null]);
+        ----
+        {key1: value1, key2: }
+        ```"#
+                    )
+                    .with_argument(
+                        "key",
+                        "For `map`: Expression to be used for key. Can be a 
constant, column, function, or any combination of arithmetic or string 
operators.\n\
+                        For `make_map`: The list of keys to be used in the 
map. Each key must be unique and non-null."
+                    )
+                    .with_argument(
+                        "value",
+                        "For `map`: Expression to be used for value. Can be a 
constant, column, function, or any combination of arithmetic or string 
operators.\n\
+                        For `make_map`: The list of values to be mapped to the 
corresponding keys."
+                    )
+                    .build()
+                    .unwrap()
+            })
+}
+
 fn get_element_type(data_type: &DataType) -> Result<&DataType> {
     match data_type {
         DataType::List(element) => Ok(element.data_type()),
diff --git a/datafusion/functions-nested/src/map_extract.rs 
b/datafusion/functions-nested/src/map_extract.rs
index 9f0c4ad29c..d2bb6595fe 100644
--- a/datafusion/functions-nested/src/map_extract.rs
+++ b/datafusion/functions-nested/src/map_extract.rs
@@ -26,9 +26,12 @@ use arrow_buffer::OffsetBuffer;
 use arrow_schema::Field;
 
 use datafusion_common::{cast::as_map_array, exec_err, Result};
-use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility};
+use datafusion_expr::scalar_doc_sections::DOC_SECTION_MAP;
+use datafusion_expr::{
+    ColumnarValue, Documentation, ScalarUDFImpl, Signature, Volatility,
+};
 use std::any::Any;
-use std::sync::Arc;
+use std::sync::{Arc, OnceLock};
 use std::vec;
 
 use crate::utils::{get_map_entry_field, make_scalar_function};
@@ -101,6 +104,48 @@ impl ScalarUDFImpl for MapExtract {
             field.first().unwrap().data_type().clone(),
         ])
     }
+
+    fn documentation(&self) -> Option<&Documentation> {
+        Some(get_map_extract_doc())
+    }
+}
+
+static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+
+fn get_map_extract_doc() -> &'static Documentation {
+    DOCUMENTATION.get_or_init(|| {
+        Documentation::builder()
+            .with_doc_section(DOC_SECTION_MAP)
+            .with_description(
+                "Returns a list containing the value for the given key or an 
empty list if the key is not present in the map.",
+            )
+            .with_syntax_example("map_extract(map, key)")
+            .with_sql_example(
+                r#"```sql
+SELECT map_extract(MAP {'a': 1, 'b': NULL, 'c': 3}, 'a');
+----
+[1]
+
+SELECT map_extract(MAP {1: 'one', 2: 'two'}, 2);
+----
+['two']
+
+SELECT map_extract(MAP {'x': 10, 'y': NULL, 'z': 30}, 'y');
+----
+[]
+```"#,
+            )
+            .with_argument(
+                "map",
+                "Map expression. Can be a constant, column, or function, and 
any combination of map operators.",
+            )
+            .with_argument(
+                "key",
+                "Key to extract from the map. Can be a constant, column, or 
function, any combination of arithmetic or string operators, or a named 
expression of the previously listed.",
+            )
+            .build()
+            .unwrap()
+    })
 }
 
 fn general_map_extract_inner(
diff --git a/datafusion/functions-nested/src/map_keys.rs 
b/datafusion/functions-nested/src/map_keys.rs
index 0b1cebb27c..f28de1c3b2 100644
--- a/datafusion/functions-nested/src/map_keys.rs
+++ b/datafusion/functions-nested/src/map_keys.rs
@@ -21,12 +21,13 @@ use crate::utils::{get_map_entry_field, 
make_scalar_function};
 use arrow_array::{Array, ArrayRef, ListArray};
 use arrow_schema::{DataType, Field};
 use datafusion_common::{cast::as_map_array, exec_err, Result};
+use datafusion_expr::scalar_doc_sections::DOC_SECTION_MAP;
 use datafusion_expr::{
-    ArrayFunctionSignature, ColumnarValue, ScalarUDFImpl, Signature, 
TypeSignature,
-    Volatility,
+    ArrayFunctionSignature, ColumnarValue, Documentation, ScalarUDFImpl, 
Signature,
+    TypeSignature, Volatility,
 };
 use std::any::Any;
-use std::sync::Arc;
+use std::sync::{Arc, OnceLock};
 
 make_udf_expr_and_func!(
     MapKeysFunc,
@@ -81,6 +82,40 @@ impl ScalarUDFImpl for MapKeysFunc {
     fn invoke(&self, args: &[ColumnarValue]) -> 
datafusion_common::Result<ColumnarValue> {
         make_scalar_function(map_keys_inner)(args)
     }
+
+    fn documentation(&self) -> Option<&Documentation> {
+        Some(get_map_keys_doc())
+    }
+}
+
+static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+
+fn get_map_keys_doc() -> &'static Documentation {
+    DOCUMENTATION.get_or_init(|| {
+        Documentation::builder()
+            .with_doc_section(DOC_SECTION_MAP)
+            .with_description(
+                "Returns a list of all keys in the map."
+            )
+            .with_syntax_example("map_keys(map)")
+            .with_sql_example(
+                r#"```sql
+SELECT map_keys(MAP {'a': 1, 'b': NULL, 'c': 3});
+----
+[a, b, c]
+
+SELECT map_keys(map([100, 5], [42, 43]));
+----
+[100, 5]
+```"#,
+            )
+            .with_argument(
+                "map",
+                "Map expression. Can be a constant, column, or function, and 
any combination of map operators."
+            )
+            .build()
+            .unwrap()
+    })
 }
 
 fn map_keys_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
diff --git a/datafusion/functions-nested/src/map_values.rs 
b/datafusion/functions-nested/src/map_values.rs
index 58c0d74eed..2b19d9fbbc 100644
--- a/datafusion/functions-nested/src/map_values.rs
+++ b/datafusion/functions-nested/src/map_values.rs
@@ -21,12 +21,13 @@ use crate::utils::{get_map_entry_field, 
make_scalar_function};
 use arrow_array::{Array, ArrayRef, ListArray};
 use arrow_schema::{DataType, Field};
 use datafusion_common::{cast::as_map_array, exec_err, Result};
+use datafusion_expr::scalar_doc_sections::DOC_SECTION_MAP;
 use datafusion_expr::{
-    ArrayFunctionSignature, ColumnarValue, ScalarUDFImpl, Signature, 
TypeSignature,
-    Volatility,
+    ArrayFunctionSignature, ColumnarValue, Documentation, ScalarUDFImpl, 
Signature,
+    TypeSignature, Volatility,
 };
 use std::any::Any;
-use std::sync::Arc;
+use std::sync::{Arc, OnceLock};
 
 make_udf_expr_and_func!(
     MapValuesFunc,
@@ -81,6 +82,40 @@ impl ScalarUDFImpl for MapValuesFunc {
     fn invoke(&self, args: &[ColumnarValue]) -> 
datafusion_common::Result<ColumnarValue> {
         make_scalar_function(map_values_inner)(args)
     }
+
+    fn documentation(&self) -> Option<&Documentation> {
+        Some(get_map_values_doc())
+    }
+}
+
+static DOCUMENTATION: OnceLock<Documentation> = OnceLock::new();
+
+fn get_map_values_doc() -> &'static Documentation {
+    DOCUMENTATION.get_or_init(|| {
+        Documentation::builder()
+            .with_doc_section(DOC_SECTION_MAP)
+            .with_description(
+                "Returns a list of all values in the map."
+            )
+            .with_syntax_example("map_values(map)")
+            .with_sql_example(
+                r#"```sql
+SELECT map_values(MAP {'a': 1, 'b': NULL, 'c': 3});
+----
+[1, , 3]
+
+SELECT map_values(map([100, 5], [42, 43]));
+----
+[42, 43]
+```"#,
+            )
+            .with_argument(
+                "map",
+                "Map expression. Can be a constant, column, or function, and 
any combination of map operators."
+            )
+            .build()
+            .unwrap()
+    })
 }
 
 fn map_values_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
diff --git a/dev/update_function_docs.sh b/dev/update_function_docs.sh
index f1f26c8b2f..13bc22afcc 100755
--- a/dev/update_function_docs.sh
+++ b/dev/update_function_docs.sh
@@ -297,4 +297,3 @@ echo "Running prettier"
 npx [email protected] --write "$TARGET_FILE"
 
 echo "'$TARGET_FILE' successfully updated!"
-
diff --git a/docs/source/user-guide/sql/scalar_functions.md 
b/docs/source/user-guide/sql/scalar_functions.md
index 547ea10808..2034114287 100644
--- a/docs/source/user-guide/sql/scalar_functions.md
+++ b/docs/source/user-guide/sql/scalar_functions.md
@@ -199,151 +199,6 @@ Unwraps struct fields into columns.
 +-----------------------+-----------------------+
 ```
 
-## Map Functions
-
-- [map](#map)
-- [make_map](#make_map)
-- [map_extract](#map_extract)
-- [map_keys](#map_keys)
-- [map_values](#map_values)
-
-### `map`
-
-Returns an Arrow map with the specified key-value pairs.
-
-```
-map(key, value)
-map(key: value)
-```
-
-#### Arguments
-
-- **key**: Expression to be used for key.
-  Can be a constant, column, or function, any combination of arithmetic or
-  string operators, or a named expression of previous listed.
-- **value**: Expression to be used for value.
-  Can be a constant, column, or function, any combination of arithmetic or
-  string operators, or a named expression of previous listed.
-
-#### Example
-
-```
-SELECT MAP(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
-----
-{POST: 41, HEAD: 33, PATCH: }
-
-SELECT MAP([[1,2], [3,4]], ['a', 'b']);
-----
-{[1, 2]: a, [3, 4]: b}
-
-SELECT MAP { 'a': 1, 'b': 2 };
-----
-{a: 1, b: 2}
-```
-
-### `make_map`
-
-Returns an Arrow map with the specified key-value pairs.
-
-```
-make_map(key_1, value_1, ..., key_n, value_n)
-```
-
-#### Arguments
-
-- **key_n**: Expression to be used for key.
-  Can be a constant, column, or function, any combination of arithmetic or
-  string operators, or a named expression of previous listed.
-- **value_n**: Expression to be used for value.
-  Can be a constant, column, or function, any combination of arithmetic or
-  string operators, or a named expression of previous listed.
-
-#### Example
-
-```
-SELECT MAKE_MAP('POST', 41, 'HEAD', 33, 'PATCH', null);
-----
-{POST: 41, HEAD: 33, PATCH: }
-```
-
-### `map_extract`
-
-Return a list containing the value for a given key or an empty list if the key 
is not contained in the map.
-
-```
-map_extract(map, key)
-```
-
-#### Arguments
-
-- `map`: Map expression.
-  Can be a constant, column, or function, and any combination of map operators.
-- `key`: Key to extract from the map.
-  Can be a constant, column, or function, any combination of arithmetic or
-  string operators, or a named expression of previous listed.
-
-#### Example
-
-```
-SELECT map_extract(MAP {'a': 1, 'b': NULL, 'c': 3}, 'a');
-----
-[1]
-```
-
-#### Aliases
-
-- element_at
-
-### `map_keys`
-
-Return a list of all keys in the map.
-
-```
-map_keys(map)
-```
-
-#### Arguments
-
-- `map`: Map expression.
-  Can be a constant, column, or function, and any combination of map operators.
-
-#### Example
-
-```
-SELECT map_keys(MAP {'a': 1, 'b': NULL, 'c': 3});
-----
-[a, b, c]
-
-select map_keys(map([100, 5], [42,43]));
-----
-[100, 5]
-```
-
-### `map_values`
-
-Return a list of all values in the map.
-
-```
-map_values(map)
-```
-
-#### Arguments
-
-- `map`: Map expression.
-  Can be a constant, column, or function, and any combination of map operators.
-
-#### Example
-
-```
-SELECT map_values(MAP {'a': 1, 'b': NULL, 'c': 3});
-----
-[1, , 3]
-
-select map_values(map([100, 5], [42,43]));
-----
-[42, 43]
-```
-
 ## Other Functions
 
 See the new documentation 
[`here`](https://datafusion.apache.org/user-guide/sql/scalar_functions_new.html)
diff --git a/docs/source/user-guide/sql/scalar_functions_new.md 
b/docs/source/user-guide/sql/scalar_functions_new.md
index 1f4ec1c278..7d0280dbc2 100644
--- a/docs/source/user-guide/sql/scalar_functions_new.md
+++ b/docs/source/user-guide/sql/scalar_functions_new.md
@@ -3898,6 +3898,150 @@ select struct(a as field_a, b) from t;
 
 - row
 
+## Map Functions
+
+- [element_at](#element_at)
+- [map](#map)
+- [map_extract](#map_extract)
+- [map_keys](#map_keys)
+- [map_values](#map_values)
+
+### `element_at`
+
+_Alias of [map_extract](#map_extract)._
+
+### `map`
+
+Returns an Arrow map with the specified key-value pairs.
+
+The `make_map` function creates a map from two lists: one for keys and one for 
values. Each key must be unique and non-null.
+
+```
+map(key, value)
+map(key: value)
+make_map(['key1', 'key2'], ['value1', 'value2'])
+```
+
+#### Arguments
+
+- **key**: For `map`: Expression to be used for key. Can be a constant, 
column, function, or any combination of arithmetic or string operators.
+  For `make_map`: The list of keys to be used in the map. Each key must be 
unique and non-null.
+- **value**: For `map`: Expression to be used for value. Can be a constant, 
column, function, or any combination of arithmetic or string operators.
+  For `make_map`: The list of values to be mapped to the corresponding keys.
+
+#### Example
+
+````sql
+        -- Using map function
+        SELECT MAP('type', 'test');
+        ----
+        {type: test}
+
+        SELECT MAP(['POST', 'HEAD', 'PATCH'], [41, 33, null]);
+        ----
+        {POST: 41, HEAD: 33, PATCH: }
+
+        SELECT MAP([[1,2], [3,4]], ['a', 'b']);
+        ----
+        {[1, 2]: a, [3, 4]: b}
+
+        SELECT MAP { 'a': 1, 'b': 2 };
+        ----
+        {a: 1, b: 2}
+
+        -- Using make_map function
+        SELECT MAKE_MAP(['POST', 'HEAD'], [41, 33]);
+        ----
+        {POST: 41, HEAD: 33}
+
+        SELECT MAKE_MAP(['key1', 'key2'], ['value1', null]);
+        ----
+        {key1: value1, key2: }
+        ```
+
+
+### `map_extract`
+
+Returns a list containing the value for the given key or an empty list if the 
key is not present in the map.
+
+````
+
+map_extract(map, key)
+
+````
+#### Arguments
+
+- **map**: Map expression. Can be a constant, column, or function, and any 
combination of map operators.
+- **key**: Key to extract from the map. Can be a constant, column, or 
function, any combination of arithmetic or string operators, or a named 
expression of the previously listed.
+
+#### Example
+
+```sql
+SELECT map_extract(MAP {'a': 1, 'b': NULL, 'c': 3}, 'a');
+----
+[1]
+
+SELECT map_extract(MAP {1: 'one', 2: 'two'}, 2);
+----
+['two']
+
+SELECT map_extract(MAP {'x': 10, 'y': NULL, 'z': 30}, 'y');
+----
+[]
+````
+
+#### Aliases
+
+- element_at
+
+### `map_keys`
+
+Returns a list of all keys in the map.
+
+```
+map_keys(map)
+```
+
+#### Arguments
+
+- **map**: Map expression. Can be a constant, column, or function, and any 
combination of map operators.
+
+#### Example
+
+```sql
+SELECT map_keys(MAP {'a': 1, 'b': NULL, 'c': 3});
+----
+[a, b, c]
+
+SELECT map_keys(map([100, 5], [42, 43]));
+----
+[100, 5]
+```
+
+### `map_values`
+
+Returns a list of all values in the map.
+
+```
+map_values(map)
+```
+
+#### Arguments
+
+- **map**: Map expression. Can be a constant, column, or function, and any 
combination of map operators.
+
+#### Example
+
+```sql
+SELECT map_values(MAP {'a': 1, 'b': NULL, 'c': 3});
+----
+[1, , 3]
+
+SELECT map_values(map([100, 5], [42, 43]));
+----
+[42, 43]
+```
+
 ## Hashing Functions
 
 - [digest](#digest)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to