FP-Growth is an algorithm used to find frequent patterns in transactions without generating a candidate itemset. It is extended in PAL to find association rules in three steps: converting transactions into a compressed frequent pattern tree, recursively finding frequent patterns from the tree, and generating association rules based on the frequent patterns. FP-Growth with relational output is also supported.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_FPGROWTH_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_FPGROWTH_PARAMETER_TBL (
	"PARAM_NAME " VARCHAR(100),
	"INT_VALUE" INTEGER, 
	"DOUBLE_VALUE" DOUBLE, 
	"STRING_VALUE" VARCHAR (100)
);

INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('MIN_SUPPORT', null, 0.2, null);
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('MIN_CONFIDENCE', null, 0.5, null);
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('MIN_LIFT', null, 1, null);
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('MAXITEMLENGTH', 5, null, null);
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('MAX_CONSEQUENT', 1, null, null);
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('LHS_RESTRICT', null, null, '1');
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('LHS_RESTRICT', null, null, '2');
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('LHS_RESTRICT', null, null, '3');
INSERT INTO PAL_FPGROWTH_PARAMETER_TBL VALUES ('TIMEOUT', 60, null, null);

DROP TABLE PAL_FPGROWTH_DATA_TBL;
CREATE COLUMN TABLE PAL_FPGROWTH_DATA_TBL (
	"TRANS" INTEGER,
	"ITEM" INTEGER
);

INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (1, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (1, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (2, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (2, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (2, 4);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (3, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (3, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (3, 4);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (3, 5);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (4, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (4, 4);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (4, 5);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (5, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (5, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (6, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (6, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (6, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (6, 4);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (7, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (8, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (8, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (8, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (9, 1);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (9, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (9, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (10, 2);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (10, 3);
INSERT INTO PAL_FPGROWTH_DATA_TBL VALUES (10, 5);

DROP TABLE PAL_FPGROWTH_RESULT_TBL;
CREATE COLUMN TABLE PAL_FPGROWTH_RESULT_TBL (
	"ANTECEDENT" NVARCHAR(1000),
	"CONSEQUENT" NVARCHAR(1000),
        "SUPPORT" DOUBLE,
        "CONFIDENCE" DOUBLE,
        "LIFT" DOUBLE
);

DO BEGIN
  lt_data = SELECT * FROM PAL_FPGROWTH_DATA_TBL;
  lt_param = SELECT * FROM PAL_FPGROWTH_PARAMETER_TBL;
  CALL _SYS_AFL.PAL_FPGROWTH (:lt_data, :lt_param, lt_result);
  INSERT INTO PAL_FPGROWTH_RESULT_TBL SELECT * FROM :lt_result;
END;

SELECT * FROM PAL_FPGROWTH_RESULT_TBL;
