From 1ec63117f4b2441b67de5f06af63207a89a14f24 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Wed, 20 May 2026 14:58:42 -0700 Subject: [PATCH 1/3] Add stubs for a subset of required string API calls --- aerospike_helpers/expressions/string.py | 68 +++++++ .../operations/string_operations.py | 177 ++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 aerospike_helpers/expressions/string.py create mode 100644 aerospike_helpers/operations/string_operations.py diff --git a/aerospike_helpers/expressions/string.py b/aerospike_helpers/expressions/string.py new file mode 100644 index 0000000000..04126880c2 --- /dev/null +++ b/aerospike_helpers/expressions/string.py @@ -0,0 +1,68 @@ +from aerospike_helpers.expressions.resources import _BaseExpr + + +class StrLen(_BaseExpr): + def __init__(self, src: str): + pass + + +class SubStr(_BaseExpr): + def __init__(self, start: int, length: int | None, src: str): + pass + + +class CharAt(_BaseExpr): + def __init__(self, index: int, src: str): + pass + + +class Find(_BaseExpr): + def __init__(self, needle: str, occurrence: int, src: str): + pass + + +class Contains(_BaseExpr): + def __init__(self, needle: str, src: str): + pass + + +class StartsWith(_BaseExpr): + def __init__(self, prefix: str, src: str): + pass + + +class EndsWith(_BaseExpr): + def __init__(self, suffix: str, src: str): + pass + + +class ToInteger(_BaseExpr): + def __init__(self, src: str): + pass + + +class ToDouble(_BaseExpr): + def __init__(self, src: str): + pass + + +class ByteLength(_BaseExpr): + def __init__(self, src: str): + pass + + +class IsNumeric(_BaseExpr): + def __init__(self, numeric_type: int, src: str): + pass + + +class ToUpper(_BaseExpr): + def __init__(self, src: str): + pass + + +class ToLower(_BaseExpr): + def __init__(self, src: str): + pass + +# TODO diff --git a/aerospike_helpers/operations/string_operations.py b/aerospike_helpers/operations/string_operations.py new file mode 100644 index 0000000000..97e556f074 --- /dev/null +++ b/aerospike_helpers/operations/string_operations.py @@ -0,0 +1,177 @@ +from enum import IntEnum + + +def strlen(bin_name: str, ctx: list | None = None): + pass + + +def substr(bin_name: str, start: int, length: int | None = None, ctx: list | None = None): + pass + + +def char_at(bin_name: str, index: int, ctx: list | None = None): + pass + + +def find(bin_name: str, needle: int, occurrence: int | None = None, ctx: list | None = None): + pass + + +def contains(bin_name: str, index: int, ctx: list | None = None): + pass + + +def starts_with(bin_name: str, prefix: str, ctx: list | None = None): + pass + + +def ends_with(bin_name: str, suffix: str, ctx: list | None = None): + pass + + +def to_integer(bin_name: str, ctx: list | None = None): + pass + + +def to_double(bin_name: str, ctx: list | None = None): + pass + + +def byte_length(bin_name: str, ctx: list | None = None): + pass + + +def is_numeric(bin_name: str, numeric_type: int | None = None, ctx: list | None = None): + pass + + +def is_upper(bin_name: str, ctx: list | None = None): + pass + + +def is_lower(bin_name: str, ctx: list | None = None): + pass + + +def to_blob(bin_name: str, ctx: list | None = None): + pass + + +def split(bin_name: str, separator: str, ctx: list | None = None): + pass + + +def base64_decode(bin_name: str, ctx: list | None = None): + pass + +# TODO: use enum for regex flags + + +def regex_compare(bin_name: str, pattern: str, regex_flags: int, ctx: list | None = None): + pass + + +class WriteFlags(IntEnum): + DEFAULT = 0 + NO_FAIL = 4 + + +class StringPolicy: + def __init__(self, write_flags: WriteFlags): + self.write_flags = write_flags + + +class RegexFlags(IntEnum): + DEFAULT = 0 + CASE_INSENSITIVE = 1 + MULTILINE = 2 + DOTALL = 4 + UNIX_LINES = 8 + GLOBAL = 16 + + +class NumericType(IntEnum): + ANY = 0 + INT = 1 + FLOAT = 2 + + +def insert(policy: StringPolicy, bin_name: str, index: int, value: str, ctx: list | None = None): + pass + + +def overwrite(policy: StringPolicy, bin_name: str, index: int, value: str, ctx: list | None = None): + pass + + +def concat(policy: StringPolicy, bin_name: str, value: str | list[str], ctx: list | None = None): + pass + + +def snip(policy: StringPolicy, bin_name: str, start: int, end: int | None = None, ctx: list | None = None): + pass + + +def replace(policy: StringPolicy, bin_name: str, needle: str, replacement: str, ctx: list | None = None): + pass + + +def replace_all(policy: StringPolicy, bin_name: str, needle: str, replacement: str, ctx: list | None = None): + pass + + +def upper(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def lower(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def casefold(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def normalize_nfc(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def trim_start(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def trim_end(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def trim(policy: StringPolicy, bin_name: str, ctx: list | None = None): + pass + + +def pad_start(policy: StringPolicy, bin_name: str, target_length: int, pad_string: str, ctx: list | None = None): + pass + + +def pad_end(policy: StringPolicy, bin_name: str, target_length: int, pad_string: str, ctx: list | None = None): + pass + + +def repeat(policy: StringPolicy, bin_name: str, count: int, ctx: list | None = None): + pass + +# TODO: regex flags enum + + +def regex_replace( + policy: StringPolicy, + bin_name: str, + pattern: str, + replacement: str, + regex_flags: int, + ctx: list | None = None +): + pass + + +def to_string(bin_name: str): + pass From d21568aa3afa8a43acd3c610eeb4afb80d9ff400 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 22 May 2026 11:00:27 -0700 Subject: [PATCH 2/3] Finish all string expression stubs. TODO now need to implement --- aerospike_helpers/expressions/string.py | 112 +++++++++++++++++++++++- 1 file changed, 111 insertions(+), 1 deletion(-) diff --git a/aerospike_helpers/expressions/string.py b/aerospike_helpers/expressions/string.py index 04126880c2..3413851d6b 100644 --- a/aerospike_helpers/expressions/string.py +++ b/aerospike_helpers/expressions/string.py @@ -1,4 +1,5 @@ from aerospike_helpers.expressions.resources import _BaseExpr +from aerospike_helpers.operations.string_operations import RegexFlags, StringPolicy class StrLen(_BaseExpr): @@ -65,4 +66,113 @@ class ToLower(_BaseExpr): def __init__(self, src: str): pass -# TODO + +class ToBlob(_BaseExpr): + def __init__(self, src: str): + pass + + +class Split(_BaseExpr): + def __init__(self, separator: str, src: str): + pass + + +class Base64Decode(_BaseExpr): + def __init__(self, src: str): + pass + + +class RegexCompare(_BaseExpr): + # TODO: set default flags + def __init__(self, pattern: str, regex_flags: RegexFlags): + pass + + +class Insert(_BaseExpr): + def __init__(self, policy: StringPolicy, index: int, value: str, src: str): + pass + + +class Overwrite(_BaseExpr): + def __init__(self, policy: StringPolicy, index: int, value: str, src: str): + pass + + +class Concat(_BaseExpr): + def __init__(self, policy: StringPolicy, values: list[str], src: str): + pass + + +class Snip(_BaseExpr): + def __init__(self, policy: StringPolicy, start: int, end: int | None, src: str): + pass + + +class Replace(_BaseExpr): + def __init__(self, policy: StringPolicy, needle: str, replacement: str, src: str): + pass + + +class ReplaceAll(_BaseExpr): + def __init__(self, policy: StringPolicy, needle: str, replacement: str, src: str): + pass + + +class Upper(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class Lower(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class CaseFold(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class NormalizeNFC(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class TrimStart(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class TrimEnd(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class Trim(_BaseExpr): + def __init__(self, policy: StringPolicy, src: str): + pass + + +class PadStart(_BaseExpr): + def __init__(self, policy: StringPolicy, target_length: int, pad_string: str, src: str): + pass + + +class PadEnd(_BaseExpr): + def __init__(self, policy: StringPolicy, target_length: int, pad_string: str, src: str): + pass + + +class Repeat(_BaseExpr): + def __init__(self, policy: StringPolicy, count: int, src: str): + pass + + +class RegexReplace(_BaseExpr): + def __init__(self, policy: StringPolicy, pattern: str, replacement: int, regex_flags: RegexFlags, src: str): + pass + + +class ToString(_BaseExpr): + def __init__(self, src: str): + pass From ae1e95b13330a7dd840e4cc40a053967f2799374 Mon Sep 17 00:00:00 2001 From: Julian Nguyen <109386615+juliannguyen4@users.noreply.github.com> Date: Fri, 22 May 2026 11:09:49 -0700 Subject: [PATCH 3/3] Add multiline string to prepare for docstrings --- aerospike_helpers/expressions/string.py | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/aerospike_helpers/expressions/string.py b/aerospike_helpers/expressions/string.py index 3413851d6b..6ddad84128 100644 --- a/aerospike_helpers/expressions/string.py +++ b/aerospike_helpers/expressions/string.py @@ -1,178 +1,249 @@ +# import aerospike from aerospike_helpers.expressions.resources import _BaseExpr from aerospike_helpers.operations.string_operations import RegexFlags, StringPolicy class StrLen(_BaseExpr): def __init__(self, src: str): + """ + """ pass class SubStr(_BaseExpr): def __init__(self, start: int, length: int | None, src: str): + """ + """ pass class CharAt(_BaseExpr): def __init__(self, index: int, src: str): + """ + """ pass class Find(_BaseExpr): def __init__(self, needle: str, occurrence: int, src: str): + """ + """ pass class Contains(_BaseExpr): def __init__(self, needle: str, src: str): + """ + """ pass class StartsWith(_BaseExpr): def __init__(self, prefix: str, src: str): + """ + """ pass class EndsWith(_BaseExpr): def __init__(self, suffix: str, src: str): + """ + """ pass class ToInteger(_BaseExpr): def __init__(self, src: str): + """ + """ pass class ToDouble(_BaseExpr): def __init__(self, src: str): + """ + """ pass class ByteLength(_BaseExpr): def __init__(self, src: str): + """ + """ pass class IsNumeric(_BaseExpr): def __init__(self, numeric_type: int, src: str): + """ + """ pass class ToUpper(_BaseExpr): def __init__(self, src: str): + """ + """ pass class ToLower(_BaseExpr): def __init__(self, src: str): + """ + """ pass class ToBlob(_BaseExpr): def __init__(self, src: str): + """ + """ pass class Split(_BaseExpr): def __init__(self, separator: str, src: str): + """ + """ pass class Base64Decode(_BaseExpr): def __init__(self, src: str): + """ + """ pass class RegexCompare(_BaseExpr): # TODO: set default flags def __init__(self, pattern: str, regex_flags: RegexFlags): + """ + """ pass class Insert(_BaseExpr): def __init__(self, policy: StringPolicy, index: int, value: str, src: str): + """ + """ pass class Overwrite(_BaseExpr): def __init__(self, policy: StringPolicy, index: int, value: str, src: str): + """ + """ pass class Concat(_BaseExpr): def __init__(self, policy: StringPolicy, values: list[str], src: str): + """ + """ pass class Snip(_BaseExpr): def __init__(self, policy: StringPolicy, start: int, end: int | None, src: str): + """ + """ pass class Replace(_BaseExpr): def __init__(self, policy: StringPolicy, needle: str, replacement: str, src: str): + """ + """ pass class ReplaceAll(_BaseExpr): def __init__(self, policy: StringPolicy, needle: str, replacement: str, src: str): + """ + """ pass class Upper(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class Lower(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class CaseFold(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class NormalizeNFC(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class TrimStart(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class TrimEnd(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class Trim(_BaseExpr): def __init__(self, policy: StringPolicy, src: str): + """ + """ pass class PadStart(_BaseExpr): def __init__(self, policy: StringPolicy, target_length: int, pad_string: str, src: str): + """ + """ pass class PadEnd(_BaseExpr): def __init__(self, policy: StringPolicy, target_length: int, pad_string: str, src: str): + """ + """ pass class Repeat(_BaseExpr): def __init__(self, policy: StringPolicy, count: int, src: str): + """ + """ pass class RegexReplace(_BaseExpr): def __init__(self, policy: StringPolicy, pattern: str, replacement: int, regex_flags: RegexFlags, src: str): + """ + """ pass class ToString(_BaseExpr): def __init__(self, src: str): + """ + """ pass