Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cf3fcc1
refactored basic.py
sgn4sangar May 20, 2026
948b895
Revert "refactored basic.py"
sgn4sangar May 20, 2026
3980766
integrating test scripts for python3 with UDF scripts
sgn4sangar May 20, 2026
75392f7
test the python3 folder
sgn4sangar May 21, 2026
923b72d
cmd line wont pass lang, hence update udf.opts.lang
sgn4sangar May 21, 2026
0fa2d3d
committing java codes
sgn4sangar May 21, 2026
1d47dc7
updating the python3 files alone
sgn4sangar May 22, 2026
6feedbc
fixed all python3 and java variants
sgn4sangar May 22, 2026
ca670fa
committing r files
sgn4sangar May 23, 2026
fdfe0af
committing r files with fixes
sgn4sangar May 23, 2026
85580d1
extending ci.json
sgn4sangar May 23, 2026
dade915
deleting python3 and r for review purpose
sgn4sangar May 27, 2026
81ae985
removing all the generic tests of python3
sgn4sangar May 27, 2026
7310e01
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 9, 2026
c3dff9c
updating java files
sgn4sangar Jun 9, 2026
a989fe0
updating the review comments
sgn4sangar Jun 16, 2026
ffcecb5
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 17, 2026
e3a4424
updating java review comments
sgn4sangar Jun 17, 2026
9d08302
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 17, 2026
4abc5bb
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 17, 2026
6e14333
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 18, 2026
1612f54
adding the missing files and functionalities
sgn4sangar Jun 18, 2026
1ff761f
getOutputColumnSQLType - ignoring all usage
sgn4sangar Jun 19, 2026
6944256
fixing issues with dynamic output
sgn4sangar Jun 19, 2026
618d494
removing unncessary tests
sgn4sangar Jun 22, 2026
c1fa71e
removing some more unnecessary tests
sgn4sangar Jun 23, 2026
c1698d4
updating proper usage of getDefaultOutputColumns
sgn4sangar Jun 23, 2026
4f0588b
Merge branch 'master' into refactor/640_generic_tests_java
sgn4sangar Jun 23, 2026
3373354
Merge branch 'refactor/640_generic_tests_java' of github.com:exasol/s…
sgn4sangar Jun 23, 2026
a572d33
reverting back the changes of ExaWrapper.java
sgn4sangar Jun 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
300 changes: 300 additions & 0 deletions test_container/tests/test/generic/java/basic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,300 @@
#!/usr/bin/env python3

from exasol_python_test_framework import udf


def create_set_returns_has_empty_input(test_case):
test_case.query(udf.fixindent('''
CREATE java SET SCRIPT
set_returns_has_empty_input(a double) RETURNS boolean AS
class SET_RETURNS_HAS_EMPTY_INPUT {
static boolean run(ExaMetadata exa, ExaIterator ctx) throws Exception {
return ctx.getDouble("a") == null;
}
}
/
'''))

def create_set_emits_has_empty_input(test_case):
test_case.query(udf.fixindent('''
CREATE java SET SCRIPT
set_emits_has_empty_input(a double) EMITS (x double, y varchar(10)) AS
class SET_EMITS_HAS_EMPTY_INPUT {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
if (ctx.getDouble("a") == null)
ctx.emit(1,"1");
else
ctx.emit(2,"2");
}
}
/
'''))


class _JavaUdfSetup(udf.TestCase):
def setUp(self):
self.query('DROP SCHEMA FN1 CASCADE', ignore_errors=True)
self.query('CREATE SCHEMA FN1')
self.query('OPEN SCHEMA FN1')
self.query(udf.fixindent('''
CREATE java SCALAR SCRIPT
basic_emit_several_groups(a INTEGER, b INTEGER)
EMITS (i INTEGER, j VARCHAR(40)) AS
class BASIC_EMIT_SEVERAL_GROUPS {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
for (int n = 0; n < ctx.getInteger("a"); n++)
for (int i = 0; i < ctx.getInteger("b"); i++)
ctx.emit(i, exa.getVmId());
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SCALAR SCRIPT
basic_emit_two_ints()
EMITS (i INTEGER, j INTEGER) AS
class BASIC_EMIT_TWO_INTS {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
ctx.emit(1,2);
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SCALAR SCRIPT
basic_nth_partial_sum(n INTEGER)
RETURNS INTEGER as
class BASIC_NTH_PARTIAL_SUM {
static int run(ExaMetadata exa, ExaIterator ctx) throws Exception {
if (ctx.getInteger("n") != null)
return ctx.getInteger("n") * (ctx.getInteger("n") + 1) / 2;
return 0;
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SCALAR SCRIPT
basic_range(n INTEGER)
EMITS (n INTEGER) AS
class BASIC_RANGE {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
if (ctx.getInteger("n") != null)
for (int i = 0; i < ctx.getInteger("n"); i++)
ctx.emit(i);
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SET SCRIPT
basic_sum(x INTEGER)
RETURNS INTEGER AS
class BASIC_SUM {
static int run(ExaMetadata exa, ExaIterator ctx) throws Exception {
int s = 0;
while (true) {
if (ctx.getInteger("x") != null)
s += ctx.getInteger("x");
if (!ctx.next())
break;
}
return s;
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SET SCRIPT
basic_sum_grp(x INTEGER)
EMITS (s INTEGER) AS
class BASIC_SUM_GRP {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
int s = 0;
while (true) {
if (ctx.getInteger("x") != null)
s += ctx.getInteger("x");
if (!ctx.next())
break;
}
ctx.emit(s);
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SET SCRIPT
basic_test_reset(i INTEGER, j VARCHAR(40))
EMITS (k INTEGER) AS
class BASIC_TEST_RESET {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
ctx.emit(ctx.getInteger("i"));
ctx.next();
ctx.emit(ctx.getInteger("i"));
ctx.reset();
ctx.emit(ctx.getInteger("i"));
ctx.next();
ctx.emit(ctx.getInteger("i"));
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SCALAR SCRIPT
performance_map_characters(text VARCHAR(1000))
EMITS (w CHAR(1), c INTEGER) AS
class PERFORMANCE_MAP_CHARACTERS {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
String text = ctx.getString("text");
if (text != null) {
for (int i = 0; i < text.length(); i++) {
if (Character.isHighSurrogate(text.charAt(i))) {
ctx.emit(text.substring(i, i + 2), 1);
i++;
}
else {
ctx.emit(text.substring(i, i + 1), 1);
}
}
}
}
}
/
'''))

self.query(udf.fixindent('''
CREATE java SET SCRIPT
performance_reduce_characters(w CHAR(1), c INTEGER)
EMITS (w CHAR(1), c INTEGER) AS
class PERFORMANCE_REDUCE_CHARACTERS {
static void run(ExaMetadata exa, ExaIterator ctx) throws Exception {
int c = 0;
String w = ctx.getString("w");
if (w != null) {
do {
c += 1;
} while (ctx.next());
ctx.emit(w, c);
}
}
}
/
'''))

create_set_emits_has_empty_input(self)
create_set_returns_has_empty_input(self)

class BasicTest(_JavaUdfSetup):

def test_basic_scalar_emits(self):
rows = self.query('''
SELECT fn1.basic_range(3)
FROM DUAL
''')
self.assertRowsEqual([(x,) for x in range(3)], sorted(rows))

def test_basic_set_returns(self):
rows = self.query('''
SELECT fn1.basic_sum(3)
FROM DUAL
''')
self.assertRowsEqual([(3,)], rows)

def test_emit_two_ints(self):
rows = self.query('''
SELECT fn1.basic_emit_two_ints()
FROM DUAL''')
self.assertRowsEqual([(1, 2)], rows)

def test_simple_combination(self):
rows = self.query('''
SELECT fn1.basic_sum(psum)
FROM (
SELECT fn1.basic_nth_partial_sum(n) AS PSUM
FROM (
SELECT fn1.basic_range(10)
FROM DUAL
)
)''')
self.assertRowsEqual([(165,)], rows)

def test_simple_combination_grouping(self):
rows = self.query('''
SELECT fn1.BASIC_SUM_GRP(psum)
FROM (
SELECT MOD(N, 3) AS n,
fn1.basic_nth_partial_sum(n) AS psum
FROM (
SELECT fn1.basic_range(10)
FROM DUAL
)
)
GROUP BY n
ORDER BY 1''')
self.assertRowsEqual([(39.0,), (54.0,), (72.0,)], rows)

def test_reset(self):
rows = self.query('''
SELECT fn1.basic_test_reset(i, j)
FROM (SELECT fn1.basic_emit_several_groups(16, 8) FROM DUAL)
GROUP BY i
ORDER BY 1''')
self.assertRowsEqual([(0.0,), (0.0,), (0.0,), (0.0,), (1.0,), (1.0,), (1.0,), (1.0,), (2.0,)], rows[:9])

def test_order_by_clause(self):
rows = self.query('''
SELECT fn1.performance_reduce_characters(w, c)
FROM (
SELECT fn1.performance_map_characters('hello hello hello abc')
FROM DUAL
)
GROUP BY w
ORDER BY c DESC''')

unsorted_list = [tuple(x) for x in rows]
sorted_list = sorted(unsorted_list, key=lambda x: x[1], reverse=True)
#for x in zip(unsorted_list, sorted_list):
# print x

self.assertEqual(sorted_list, unsorted_list)


class SetWithEmptyInput(udf.TestCase):
def setUp(self):
self.query('DROP SCHEMA FN1 CASCADE', ignore_errors=True)
self.query('CREATE SCHEMA FN1')
self.query('DROP SCHEMA FN2 CASCADE', ignore_errors=True)
self.query('CREATE SCHEMA FN2')
self.query('OPEN SCHEMA FN1')
self.query('CREATE TABLE FN2.empty_table(c int)')

create_set_returns_has_empty_input(self)
create_set_emits_has_empty_input(self)

def test_set_returns_has_empty_input_group_by(self):
self.query("""select FN1.set_returns_has_empty_input(c) from FN2.empty_table group by 'X'""")
self.assertEqual(0, self.rowcount())

def test_set_returns_has_empty_input_no_group_by(self):
rows = self.query('''select FN1.set_returns_has_empty_input(c) from FN2.empty_table''')
self.assertRowsEqual([(None,)], rows)


def test_set_emits_has_empty_input_group_by(self):
self.query("""select FN1.set_emits_has_empty_input(c) from FN2.empty_table group by 'X'""")
self.assertEqual(0, self.rowcount())

def test_set_emits_has_empty_input_no_group_by(self):
rows = self.query('''select FN1.set_emits_has_empty_input(c) from FN2.empty_table''')
self.assertRowsEqual([(None,None)], rows)


if __name__ == '__main__':
udf.main()
Loading
Loading