Skip to content

Commit

Permalink
feat: add trim/ltrim/rtrim with single input argument to remove spaces
Browse files Browse the repository at this point in the history
  • Loading branch information
scgkiran committed Dec 11, 2024
1 parent 4c00b1c commit 56c0260
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 4 deletions.
30 changes: 30 additions & 0 deletions extensions/functions_string.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1316,6 +1316,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: rtrim
description: >-
Expand All @@ -1338,6 +1348,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: trim
description: >-
Expand All @@ -1360,6 +1380,16 @@ scalar_functions:
name: "characters"
description: "The set of characters to remove."
return: "string"
- args:
- value: "varchar<L1>"
name: "input"
description: "The string to remove characters from."
return: "varchar<L1>"
- args:
- value: "string"
name: "input"
description: "The string to remove characters from."
return: "string"
-
name: lpad
description: >-
Expand Down
21 changes: 21 additions & 0 deletions tests/cases/string/ltrim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,28 @@ ltrim(''::str, ' '::str) = ''::str
ltrim(' '::str, ' '::str) = ''::str
ltrim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
ltrim('abc'::str) = 'abc'::str
ltrim(' abc'::str) = 'abc'::str
ltrim('abc '::str) = 'abc '::str
ltrim(' abc '::str) = 'abc '::str
ltrim(''::str) = ''::str
ltrim(' '::str) = ''::str
ltrim(null::str) = null::str

# two_inputs: Examples with character input to trim off
ltrim('aaaaabc'::str, 'a'::str) [spaces_only:FALSE] = 'bc'::str
ltrim('abcabcdef'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str
ltrim('abccbadef'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str

# ltrim with varchar
ltrim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
ltrim(' abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
ltrim('abc '::vchar<20>, ' '::vchar<5>) = 'abc '::vchar<20>
ltrim(' abc '::vchar<20>, ' '::vchar<5>) = 'abc '::vchar<20>
ltrim('abc'::vchar<20>) = 'abc'::vchar<20>
ltrim(' abc'::vchar<20>) = 'abc'::vchar<20>
ltrim('abc '::vchar<20>) = 'abc '::vchar<20>
ltrim(' abc '::vchar<20>) = 'abc '::vchar<20>
ltrim('aaaaabc'::vchar<20>, 'a'::vchar<9>) [spaces_only:False] = 'bc'::vchar<20>
ltrim('abcabcdef'::vchar<20>, 'abc'::vchar<9>) [spaces_only:False] = 'def'::vchar<20>
21 changes: 21 additions & 0 deletions tests/cases/string/rtrim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,28 @@ rtrim(''::str, ' '::str) = ''::str
rtrim(' '::str, ' '::str) = ''::str
rtrim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
rtrim('abc'::str) = 'abc'::str
rtrim(' abc'::str) = ' abc'::str
rtrim('abc '::str) = 'abc'::str
rtrim(' abc '::str) = ' abc'::str
rtrim(''::str) = ''::str
rtrim(' '::str) = ''::str
rtrim(null::str) = null::str

# two_inputs: Examples with character input to trim off
rtrim('aaaaabccccc'::str, 'c'::str) [spaces_only:FALSE] = 'aaaaab'::str
rtrim('abcabcdef'::str, 'def'::str) [spaces_only:FALSE] = 'abcabc'::str
rtrim('defabccba'::str, 'abc'::str) [spaces_only:FALSE] = 'def'::str

# rtrim with varchar
rtrim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
rtrim(' abc'::vchar<20>, ' '::vchar<5>) = ' abc'::vchar<20>
rtrim('abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
rtrim(' abc '::vchar<20>, ' '::vchar<5>) = ' abc'::vchar<20>
rtrim('abc'::vchar<20>) = 'abc'::vchar<20>
rtrim(' abc'::vchar<20>) = ' abc'::vchar<20>
rtrim('abc '::vchar<20>) = 'abc'::vchar<20>
rtrim(' abc '::vchar<20>) = ' abc'::vchar<20>
rtrim('aaaaabccccc'::vchar<20>, 'c'::vchar<9>) [spaces_only:False] = 'aaaaab'::vchar<20>
rtrim('abcabcdef'::vchar<20>, 'def'::vchar<9>) [spaces_only:False] = 'abcabc'::vchar<20>
21 changes: 21 additions & 0 deletions tests/cases/string/trim.test
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,28 @@ trim(''::str, ' '::str) = ''::str
trim(' '::str, ' '::str) = ''::str
trim(null::str, ' '::str) = null::str

# spaces_only: Examples with only spaces to trim off
trim('abc'::str) = 'abc'::str
trim(' abc'::str) = 'abc'::str
trim('abc '::str) = 'abc'::str
trim(' abc '::str) = 'abc'::str
trim(''::str) = ''::str
trim(' '::str) = ''::str
trim(null::str) = null::str

# two_inputs: Examples with character input to trim off
trim('aaaaabcccccaaa'::str, 'a'::str) [spaces_only:False] = 'bccccc'::str
trim('defabcabcdef'::str, 'def'::str) [spaces_only:False] = 'abcabc'::str
trim('abcdefcbaa'::str, 'abc'::str) [spaces_only:False] = 'def'::str

# trim with varchar
trim('abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim(' abc'::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim('abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim(' abc '::vchar<20>, ' '::vchar<5>) = 'abc'::vchar<20>
trim('abc'::vchar<20>) = 'abc'::vchar<20>
trim(' abc'::vchar<20>) = 'abc'::vchar<20>
trim('abc '::vchar<20>) = 'abc'::vchar<20>
trim(' abc '::vchar<20>) = 'abc'::vchar<20>
trim('aaaaabcccccaaa'::vchar<20>, 'a'::vchar<9>) [spaces_only:False] = 'bccccc'::vchar<20>
trim('defabcabcdef'::vchar<20>, 'def'::vchar<9>) [spaces_only:False] = 'abcabc'::vchar<20>
8 changes: 8 additions & 0 deletions tests/coverage/visitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,8 @@ def visitArgument(self, ctx: FuncTestCaseParser.ArgumentContext):
return self.visitBooleanArg(ctx.booleanArg())
if ctx.stringArg() is not None:
return self.visitStringArg(ctx.stringArg())
if ctx.varCharArg() is not None:
return self.visitVarCharArg(ctx.varCharArg())
if ctx.decimalArg() is not None:
return self.visitDecimalArg(ctx.decimalArg())
if ctx.dateArg() is not None:
Expand Down Expand Up @@ -330,6 +332,12 @@ def visitBooleanArg(self, ctx: FuncTestCaseParser.BooleanArgContext):
def visitStringArg(self, ctx: FuncTestCaseParser.StringArgContext):
return CaseLiteral(value=ctx.StringLiteral().getText(), type="str")

def visitVarCharArg(self, ctx: FuncTestCaseParser.VarCharArgContext):
return CaseLiteral(
value=ctx.StringLiteral().getText(),
type=ctx.varCharType().getText().lower(),
)

def visitDecimalArg(self, ctx: FuncTestCaseParser.DecimalArgContext):
return CaseLiteral(
value=self.visitNumericLiteral(ctx.numericLiteral()),
Expand Down
8 changes: 4 additions & 4 deletions tests/test_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ def test_substrait_extension_coverage():
all_test_files = load_all_testcases(test_case_dir)
coverage = get_test_coverage(all_test_files, registry)

assert coverage.test_count >= 1077
assert coverage.test_count >= 1128
assert (
coverage.num_tests_with_no_matching_function == 0
), f"{coverage.num_tests_with_no_matching_function} tests with no matching function"
assert coverage.num_covered_function_variants >= 226
assert coverage.total_function_variants >= 513
assert coverage.num_covered_function_variants >= 235
assert coverage.total_function_variants >= 519
assert (
coverage.total_function_variants - coverage.num_covered_function_variants
) <= 287, (
) <= 284, (
f"Coverage gap too large: {coverage.total_function_variants - coverage.num_covered_function_variants} "
f"function variants with no tests, out of {coverage.total_function_variants} total function variants."
)
Expand Down

0 comments on commit 56c0260

Please sign in to comment.