| --------------------------------------------------------------------------- |
| -- Rules: |
| -- ------ |
| -- 1) Any DB objects should be created w/o schema prefix, |
| -- since this file is executed in a separate schema context. |
| -- 2) There should be no DROP statements in this script, since |
| -- all objects created in the default schema will be cleaned-up outside. |
| --------------------------------------------------------------------------- |
| |
| --------------------------------------------------------------------------- |
| -- Setup: |
| --------------------------------------------------------------------------- |
| CREATE OR REPLACE FUNCTION assoc_array_eq |
| ( |
| arr1 TEXT[], |
| arr2 TEXT[] |
| ) |
| RETURNS BOOL AS $$ |
| SELECT COUNT(*) = array_upper($1, 1) AND array_upper($1, 1) = array_upper($2, 1) |
| FROM (SELECT unnest($1) id) t1, (SELECT unnest($2) id) t2 |
| WHERE t1.id = t2.id; |
| |
| $$ LANGUAGE sql IMMUTABLE; |
| |
| |
| CREATE OR REPLACE FUNCTION install_test() RETURNS VOID AS $$ |
| declare |
| result1 TEXT; |
| result2 TEXT; |
| result3 TEXT; |
| result4 TEXT; |
| result5 TEXT; |
| result_maxiter TEXT; |
| res MADLIB_SCHEMA.assoc_rules_results; |
| output_schema TEXT; |
| output_table TEXT; |
| total_rules INT; |
| total_time INTERVAL; |
| begin |
| DROP TABLE IF EXISTS test_data1; |
| CREATE TABLE test_data1 ( |
| trans_id INT |
| , product INT |
| ); |
| |
| DROP TABLE IF EXISTS test_data2; |
| CREATE TABLE test_data2 ( |
| trans_id INT |
| , product VARCHAR |
| ); |
| |
| |
| INSERT INTO test_data1 VALUES (1,1); |
| INSERT INTO test_data1 VALUES (1,2); |
| INSERT INTO test_data1 VALUES (3,3); |
| INSERT INTO test_data1 VALUES (8,4); |
| INSERT INTO test_data1 VALUES (10,1); |
| INSERT INTO test_data1 VALUES (10,2); |
| INSERT INTO test_data1 VALUES (10,3); |
| INSERT INTO test_data1 VALUES (19,2); |
| |
| INSERT INTO test_data2 VALUES (1, 'beer'); |
| INSERT INTO test_data2 VALUES (1, 'diapers'); |
| INSERT INTO test_data2 VALUES (1, 'chips'); |
| INSERT INTO test_data2 VALUES (2, 'beer'); |
| INSERT INTO test_data2 VALUES (2, 'diapers'); |
| INSERT INTO test_data2 VALUES (3, 'beer'); |
| INSERT INTO test_data2 VALUES (3, 'diapers'); |
| INSERT INTO test_data2 VALUES (4, 'beer'); |
| INSERT INTO test_data2 VALUES (4, 'chips'); |
| INSERT INTO test_data2 VALUES (5, 'beer'); |
| INSERT INTO test_data2 VALUES (6, 'beer'); |
| INSERT INTO test_data2 VALUES (6, 'diapers'); |
| INSERT INTO test_data2 VALUES (6, 'chips'); |
| INSERT INTO test_data2 VALUES (7, 'beer'); |
| INSERT INTO test_data2 VALUES (7, 'diapers'); |
| |
| DROP TABLE IF EXISTS test1_exp_result; |
| CREATE TABLE test1_exp_result ( |
| ruleid integer, |
| pre text[], |
| post text[], |
| support double precision, |
| confidence double precision, |
| lift double precision, |
| conviction double precision |
| ) ; |
| |
| DROP TABLE IF EXISTS test2_exp_result; |
| CREATE TABLE test2_exp_result ( |
| ruleid integer, |
| pre text[], |
| post text[], |
| support double precision, |
| confidence double precision, |
| lift double precision, |
| conviction double precision, |
| lhs_1d BOOL, |
| rhs_1d BOOL |
| ) ; |
| |
| |
| INSERT INTO test1_exp_result VALUES (7, '{3}', '{1}', 0.20000000000000001, 0.5, 1.2499999999999998, 1.2); |
| INSERT INTO test1_exp_result VALUES (4, '{2}', '{1}', 0.40000000000000002, 0.66666666666666674, 1.6666666666666667, 1.8000000000000003); |
| INSERT INTO test1_exp_result VALUES (1, '{1}', '{2,3}', 0.20000000000000001, 0.5, 2.4999999999999996, 1.6000000000000001); |
| INSERT INTO test1_exp_result VALUES (9, '{2,3}', '{1}', 0.20000000000000001, 1, 2.4999999999999996, 0); |
| INSERT INTO test1_exp_result VALUES (6, '{1,2}', '{3}', 0.20000000000000001, 0.5, 1.2499999999999998, 1.2); |
| INSERT INTO test1_exp_result VALUES (8, '{3}', '{2}', 0.20000000000000001, 0.5, 0.83333333333333337, 0.80000000000000004); |
| INSERT INTO test1_exp_result VALUES (5, '{1}', '{2}', 0.40000000000000002, 1, 1.6666666666666667, 0); |
| INSERT INTO test1_exp_result VALUES (2, '{3}', '{2,1}', 0.20000000000000001, 0.5, 1.2499999999999998, 1.2); |
| INSERT INTO test1_exp_result VALUES (10, '{3,1}', '{2}', 0.20000000000000001, 1, 1.6666666666666667, 0); |
| INSERT INTO test1_exp_result VALUES (3, '{1}', '{3}', 0.20000000000000001, 0.5, 1.2499999999999998, 1.2); |
| |
| INSERT INTO test2_exp_result VALUES (7, '{chips,diapers}', '{beer}', 0.2857142857142857, 1, 1, 0, false, true); |
| INSERT INTO test2_exp_result VALUES (2, '{chips}', '{diapers}', 0.2857142857142857, 0.66666666666666663, 0.93333333333333324, 0.85714285714285698, true, true); |
| INSERT INTO test2_exp_result VALUES (1, '{chips}', '{diapers,beer}', 0.2857142857142857, 0.66666666666666663, 0.93333333333333324, 0.85714285714285698, true, false); |
| INSERT INTO test2_exp_result VALUES (6, '{diapers}', '{beer}', 0.7142857142857143, 1, 1, 0, true, true); |
| INSERT INTO test2_exp_result VALUES (4, '{beer}', '{diapers}', 0.7142857142857143, 0.7142857142857143, 1, 1, true, true); |
| INSERT INTO test2_exp_result VALUES (3, '{chips,beer}', '{diapers}', 0.2857142857142857, 0.66666666666666663, 0.93333333333333324, 0.85714285714285698, false, true); |
| INSERT INTO test2_exp_result VALUES (5, '{chips}', '{beer}', 0.42857142857142855, 1, 1, 0, true, true); |
| |
| res = MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data1','madlib_installcheck_assoc_rules', false); |
| |
| -- ensure the members in the returned type was not changed by mistake. |
| output_schema = res.output_schema; |
| output_table = res.output_table; |
| total_rules = res.total_rules; |
| total_time = res.total_time; |
| |
| SELECT INTO result1 CASE WHEN count(*) = 10 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules t1, test1_exp_result t2 |
| WHERE assoc_array_eq(t1.pre, t2.pre) AND |
| assoc_array_eq(t1.post, t2.post) AND |
| abs(t1.support - t2.support) < 1E-10 AND |
| abs(t1.confidence - t2.confidence) < 1E-10; |
| IF result1 = 'FAIL' THEN |
| RAISE EXCEPTION 'Association rules mining failed. No results were returned for result 1.'; |
| END IF; |
| |
| DROP TABLE IF EXISTS madlib_installcheck_assoc_rules.assoc_rules; |
| PERFORM MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false); |
| SELECT INTO result2 CASE WHEN count(*) = 7 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules t1, test2_exp_result t2 |
| WHERE assoc_array_eq(t1.pre, t2.pre) AND |
| assoc_array_eq(t1.post, t2.post) AND |
| abs(t1.support - t2.support) < 1E-10 AND |
| abs(t1.confidence - t2.confidence) < 1E-10; |
| IF (result2 = 'FAIL') THEN |
| RAISE EXCEPTION 'Association rules mining failed. No results were returned for result 2.'; |
| END IF; |
| |
| -- Test for max_RHS_size=2. No rules with RHS greater than 1 item must exist. |
| DROP TABLE IF EXISTS madlib_installcheck_assoc_rules.assoc_rules; |
| PERFORM MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, NULL, NULL, 1); |
| SELECT INTO result3 CASE WHEN count(*) = 6 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules t1, test2_exp_result t2 |
| WHERE assoc_array_eq(t1.pre, t2.pre) AND |
| assoc_array_eq(t1.post, t2.post) AND |
| abs(t1.support - t2.support) < 1E-10 AND |
| abs(t1.confidence - t2.confidence) < 1E-10 AND |
| rhs_1d=true; |
| IF result3 = 'FAIL' THEN |
| RAISE EXCEPTION 'Association rules mining failed. Assertion failed when max_RHS_size=1'; |
| END IF; |
| |
| -- Test for max_LHS_size=2. No rules with LHS greater than 1 item must exist. |
| DROP TABLE IF EXISTS madlib_installcheck_assoc_rules.assoc_rules; |
| PERFORM MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, NULL, 1, NULL); |
| SELECT INTO result4 CASE WHEN count(*) = 5 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules t1, test2_exp_result t2 |
| WHERE assoc_array_eq(t1.pre, t2.pre) AND |
| assoc_array_eq(t1.post, t2.post) AND |
| abs(t1.support - t2.support) < 1E-10 AND |
| abs(t1.confidence - t2.confidence) < 1E-10 AND |
| lhs_1d=true; |
| IF result4 = 'FAIL' THEN |
| RAISE EXCEPTION 'Association rules mining failed. Assertion failed when max_LHS_size=1'; |
| END IF; |
| |
| -- Test for max_itemset_size=2. No rules with either LHS or RHS should contain greater than 1 item. |
| DROP TABLE IF EXISTS madlib_installcheck_assoc_rules.assoc_rules; |
| PERFORM MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, 2, NULL, NULL); |
| SELECT INTO result5 CASE WHEN count(*) = 4 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules t1, test2_exp_result t2 |
| WHERE assoc_array_eq(t1.pre, t2.pre) AND |
| assoc_array_eq(t1.post, t2.post) AND |
| abs(t1.support - t2.support) < 1E-10 AND |
| abs(t1.confidence - t2.confidence) < 1E-10 AND |
| rhs_1d=true AND |
| lhs_1d=true; |
| IF result5 = 'FAIL' THEN |
| RAISE EXCEPTION 'Association rules mining failed. Assertion failed when max_itemset_size=2'; |
| END IF; |
| |
| DROP TABLE IF EXISTS madlib_installcheck_assoc_rules.assoc_rules; |
| PERFORM MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, 2); |
| SELECT INTO result_maxiter CASE WHEN count(*) = 4 then 'PASS' ELSE 'FAIL' END |
| FROM assoc_rules; |
| |
| |
| DROP TABLE IF EXISTS test2_exp_result; |
| DROP TABLE IF EXISTS test1_exp_result; |
| |
| IF result_maxiter = 'FAIL' THEN |
| RAISE EXCEPTION 'Association rules mining error when max_iter parameter specified.'; |
| END IF; |
| |
| RAISE INFO 'Association rules dev check output test cases passed.'; |
| RETURN; |
| |
| end $$ language plpgsql; |
| |
| --------------------------------------------------------------------------- |
| -- Test |
| --------------------------------------------------------------------------- |
| SELECT install_test(); |
| |
| -- Input test cases. |
| SELECT MADLIB_SCHEMA.assert(MADLIB_SCHEMA.trap_error($TRAP$ |
| SELECT MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, 2, 0, NULL); |
| $TRAP$) = 1, 'Should error out if max_LHS_size is < 1'); |
| |
| SELECT MADLIB_SCHEMA.assert(MADLIB_SCHEMA.trap_error($TRAP$ |
| SELECT MADLIB_SCHEMA.assoc_rules (.1, .5, 'trans_id', 'product', 'test_data2','madlib_installcheck_assoc_rules', false, NULL, 5, -1); |
| $TRAP$) = 1, 'Should error out if max_RHS_size is < 1'); |
| DROP TABLE IF EXISTS test_data1; |
| DROP TABLE IF EXISTS test_data2; |