.kxi.udfs¶
Package resolution
All operations resolve against the path set in the KX_PACKAGE_PATH
environment variable. Ensure this points to your installed packages directory
before calling any listing or loading functions.
.kxi.udfs.list.file¶
List all the UDFs defined in a specific file
.kxi.udfs.list.file[path]
import kxi.packages
kxi.packages.udfs.list_udfs_in_file(path, udf_sym=...) # -> pd.DataFrame
Parameters:
| name | type | description |
|---|---|---|
path |
string |
Path to the file that is to be searched for UDFs. Can be an absolute or relative path. |
udfSym |
string |
Symbol for user-defined function e.g. udf, my_udf, myudf, ... |
Returns:
| type | description |
|---|---|
table |
Table outlining all the UDFs defined within the specified file. |
List a summary of all the UDFs defined within a specified file
q).kxi.udfs.list.file["test/test-packages/ml/1.0.0/ml.q";"udf"]
name function language file_path descrip..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1.0.0/ml.q" "Additi..
import kxi.packages
kxi.packages.udfs.list_udfs_in_file("test/test-packages/ml/1.0.0/ml.q")
# name function language file_path ...
# 0 ml_udf .test.test_udf q test/test-packages/ml/1.0.0/ml.q ...
kxi.packages.udfs.list_udfs_in_file("test/test-packages/test/0.0.4/init.q", udf_sym="myudf")
# name function language file_path ...
# 0 testudf .tester.udf q test/test-packages/test/0.0.4/init.q ...
.kxi.udfs.list.folder¶
List all the UDFs defined in the files within a specific folder
.kxi.udfs.list.folder[path]
import kxi.packages
kxi.packages.udfs.list_udfs_in_folder(path, udf_sym=...) # -> pd.DataFrame
Parameters:
| name | type | description |
|---|---|---|
path |
string |
Path to the folder that is to be searched for UDFs. Can be an absolute or relative path. |
udfSym |
string |
Symbol for user-defined function e.g. udf, my_udf, myudf, ... |
Returns:
| type | description |
|---|---|
table |
Table outlining all the UDFs defined within the files in the specified folder. |
List a summary of all the UDFs defined within the files in a specified folder
q).kxi.udfs.list.folder["test/test-packages/ml";"udf"]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1..
"py_udf" "func" "py" "test/test-packages/ml/1..
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1..
"filter_udf" ".test.filter_udf" ,"q" "test/test-packages/ml/1..
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
import kxi.packages
kxi.packages.udfs.list_udfs_in_folder("test/test-packages/ml")
# name function language file_path ...
# 0 ml_udf .test.test_udf q test/test-packages/ml/1.0.0/ml.q ...
# 1 test21 func2 py test/test-packages/ml/1.0.0/src/example_udfs.py ...
# 2 test12 func1 py test/test-packages/ml/1.0.0/src/example_udfs.py ...
# 3 py_udf func py test/test-packages/ml/1.0.0/src/test.py ...
# 4 map_udf .test.map_udf q test/test-packages/ml/1.0.0/src/test1.q ...
kxi.packages.udfs.list_udfs_in_folder("test/test-packages/test/0.0.4", udf_sym="myudf")
# name function language file_path ...
# 0 testudf .tester.udf q test/test-packages/test/0.0.4/init.q ...
.kxi.udfs.list.all¶
List all UDFs defined at the path under KX_PACKAGE_PATH with udf symbol in a list
.kxi.udfs.list.all[]
.kxi.udfs.list.all[udfSyms]
import kxi.packages
kxi.packages.udfs.list(*, udf_syms=...) # -> pd.DataFrame
Parameters:
| name | type | description |
|---|---|---|
udfSyms |
string[] |
Symbols for user-defined function e.g. ("udf"; "my_udf"; "myudf") |
Returns:
| type | description |
|---|---|
table |
Table containing all the UDFs defined under KX_PACKAGE_PATH which match the presented search criteria. |
q)setenv[`KX_PACKAGE_PATH;"test/test-packages"]
q).kxi.udfs.list.all[]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1..
"py_udf" "func" "py" "test/test-packages/ml/1..
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1..
"filter_udf" ".test.filter_udf" ,"q" "test/test-packages/ml/1..
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
import kxi.packages
kxi.packages.udfs.list()
# name function language ...
# 0 my_udf .test.sub_namespace.test_udf q ...
# 1 ml_udf .test.test_udf q ...
# 2 test21 func2 py ...
kxi.packages.udfs.list(udf_syms=["myudf"])
# name function language ...
# 0 testudf .tester.udf q ...
.kxi.udfs.list.search¶
List all UDFs defined at the path under KX_PACKAGE_PATH with udf symbol in a list
.kxi.udfs.list.search[name;package;version]
.kxi.udfs.list.search[name;package;version;udfSyms]
import kxi.packages
kxi.packages.udfs.search(udf_name=..., package_name=..., package_version=..., *, udf_syms=...) # -> pd.DataFrame
Parameters:
| name | type | description |
|---|---|---|
name |
string or :: |
Regex filter string used to search for specific UDF name patterns. Can also be :: to include all UDF names. |
package |
string or :: |
Regex filter string used to search for specific package name patterns. Can also be :: to include all package names. |
version |
string or :: |
Regex filter string used to search for specific package version patterns. Can also be :: to include all package versions. |
udfSyms |
string[] |
Symbols for user-defined function e.g. ("udf"; "my_udf"; "myudf") |
Returns:
| type | description |
|---|---|
table |
Table containing all the UDFs defined under KX_PACKAGE_PATH which match the presented search criteria. |
List a summary of all UDFs defined under KX_PACKAGE_PATH which match the presented search criteria
q)setenv[`KX_PACKAGE_PATH;"test/test-packages"]
q).kxi.udfs.list.searchPrep[::;::;::]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1..
"py_udf" "func" "py" "test/test-packages/ml/1..
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1..
"filter_udf" ".test.filter_udf" ,"q" "test/test-packages/ml/1..
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"test" ".test.function" ,"q" "test/test-packages/test..
import kxi.packages
kxi.packages.udfs.search()
# name function language ...
# 0 my_udf .test.sub_namespace.test_udf q ...
# 1 ml_udf .test.test_udf q ...
kxi.packages.udfs.search(package_name="*ml*")
# name function language ...
# 0 ml_udf .test.test_udf q ...
# 1 test21 func2 py ...
kxi.packages.udfs.search("m*")
# name function language ...
# 0 my_udf .test.sub_namespace.test_udf q ...
# 1 ml_udf .test.test_udf q ...
kxi.packages.udfs.search(udf_syms=["myudf"])
# name function language ...
# 0 testudf .tester.udf q ...
Search for all UDFs associated with the ml package
q)setenv[`KX_PACKAGE_PATH;"test/test-packages"]
q).kxi.udfs.list.searchPrep[::;"ml";::]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1..
"py_udf" "func" "py" "test/test-packages/ml/1..
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1..
"filter_udf" ".test.filter_udf" ,"q" "test/test-packages/ml/1..
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
Search for all UDFs that start with the letter named "m"
q)setenv[`KX_PACKAGE_PATH;"test/test-packages"]
q).kxi.udfs.list.search["m*";::;::]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1...
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1...
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1...
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2...
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2...
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2...
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2...
.kxi.udfs.rest_list¶
udfs.rest_list:{[]
url:getenv[KXI_PACKAGE_MANAGER_SERVICE],"/v2/udfs?relationships=package";
packages.log.info "Listing udfs via REST";
hdr:.curl.commonHeaders[];
res:.curl.geturlheaders!(url;hdr);
if[0=count res[res][data];
packages.log.info "No udfs available";
:()
];
pkgInfo: ?[res[res][data][relationships][package];();0b;packageversion!((meta;::;enlist name);(meta;::;enlist version))];
data:delete uuid from res[res][data][attributes],'pkgInfo;
empty_table: flip namefunctionlanguagefile_pathudf_symdescriptioncategorytagpackageversion!();
output:raze empty_table upsert/: data;
:update file_path:(package,'("/",'file_path)) from output
}
.kxi.udfs.load¶
Load a UDF into memory
.kxi.udfs.load[name;package]
.kxi.udfs.load[name;package;version;force]
import kxi.packages
kxi.packages.udfs.load(udf_name, package_name, package_version=..., *, udf_syms=..., *, force=...) # -> Callable
Parameters:
| name | type | description | default |
|---|---|---|---|
name |
string |
Name of the UDF to be loaded. | Required |
package |
string |
Name of the package from which to load the UDF. | Required |
options:
| name | type | description | default |
|---|---|---|---|
version |
string or :: |
Version of the package from which to load the UDF. Can also be :: to use the latest version of the specified package. |
:: |
force |
boolean |
Whether to load the UDF regardless of whether a UDF of the same name has been loaded previously from a differently versioned package. | 0b |
Returns:
| type | description |
|---|---|
function |
User-defined function as a callable function. |
Loads the file associated with a UDF in order to retrieve the User-Defined Function for use.
Load the UDF "my_udf" from the "ml" package
q).kxi.udfs.list.all[]
name function language file_path ..
-----------------------------------------------------------------------------..
"ml_udf" ".test.test_udf" ,"q" "test/test-packages/ml/1..
"py_udf" "func" "py" "test/test-packages/ml/1..
"map_udf" ".test.map_udf" ,"q" "test/test-packages/ml/1..
"filter_udf" ".test.filter_udf" ,"q" "test/test-packages/ml/1..
"merge_udf" ".test.merge_udf" ,"q" "test/test-packages/ml/1..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"myudf" ".test.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"my_udf" ".ml.testing.func" ,"q" "test/test-packages/ml/2..
"test_udf" ".ml.sub_namespace.test_udf" ,"q" "test/test-packages/ml/2..
"test" ".test.function" ,"q" "test/test-packages/test..
q).kxi.udfs.load["my_udf";"ml"]
{[table;params]
1+table
}
import kxi.packages
# load the UDF "my_udf" from the "ml" package (latest version)
my_udf = kxi.packages.udfs.load("my_udf", "ml")
# load the UDF "test" from the "1.2.0" version of the "test" package
test_udf = kxi.packages.udfs.load("test", "test", "1.2.0")
# load the same UDF from two different versions of a package
udf1 = kxi.packages.udfs.load("py_udf", "test_package", "1.0.0")
udf2 = kxi.packages.udfs.load("py_udf", "test_package", "1.1.0", force=True)
Load the UDF "test" from the "1.2.0" version of the "test" package
q).kxi.udfs.load["test";"test";"1.2.0"]
{[table;params]table+params`test}
Load a UDF multiple times
q)udf1:.kxi.udfs.load["test";"test";"1.1.0";.var.kw[`force; 1b]];
q)udf2:.kxi.udfs.load["test";"test";"1.1.0";.var.kw[`force; 1b]];