Skip to content

.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]];

Back to top