From 6d579f595094ea55568c67254f35d40a58fbfa1e Mon Sep 17 00:00:00 2001 From: Jim DeFabia Date: Thu, 27 Jul 2023 16:12:20 -0400 Subject: [PATCH] HPCC-29993 Fix FUNCTION and MODULE doc examples so they can run Signed-off-by: Jim DeFabia --- .../ECLR_mods/SpecStruc-FuncTion.xml | 104 +++++++----------- .../ECLR_mods/SpecStruc-Module.xml | 60 +++++----- 2 files changed, 73 insertions(+), 91 deletions(-) diff --git a/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml b/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml index 455f8b3e87e..34202f202d0 100644 --- a/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml +++ b/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml @@ -88,69 +88,27 @@ Example: - EXPORT doProjectChild(parentRecord l,UNSIGNED idAdjust2) := FUNCTION - newChildRecord copyChild(childRecord l) := TRANSFORM - SELF.person_id := l.person_id + idAdjust2; - SELF := l; - END; - - RETURN PROJECT(CHOOSEN(l.children, numChildren),copyChild(LEFT)); -END; - //And called from -SELF.children := doProjectChild(l, 99); - -//********************************** -EXPORT isAnyRateGE(STRING1 rate) := FUNCTION - SetValidRates := ['0','1','2','3','4','5','6','7','8','9']; - IsValidTradeRate := ValidDate(Trades.trd_drpt) AND - Trades.trd_rate >= rate AND - Trades.trd_rate IN SetValidRates; - ValidPHR := Prev_rate(phr_grid_flag = TRUE, - phr_rate IN SetValidRates, - ValidDate(phr_date)); - IsPHRGridRate := EXISTS(ValidPHR(phr_rate >= rate, - AgeOf(phr_date)<=24)); - IsMaxPHRRate := MAX(ValidPHR(AgeOf(phr_date) > 24), - Prev_rate.phr_rate) >= rate; - RETURN IsValidTradeRate OR IsPHRGridRate OR IsMaxPHRRate; -END; - -//************************************************************* -//a FUNCTION with side-effect Action -namesTable := FUNCTION - namesRecord := RECORD - STRING20 surname; - STRING10 forename; - INTEGER2 age := 25; - END; - o := OUTPUT('namesTable used by user <x>'); - ds := DATASET([{'x','y',22}],namesRecord); - RETURN WHEN(ds,O); -END; -z := namesTable : PERSIST('z'); - //the PERSIST causes the side-effect action to execute only when the PERSIST is re-built - -OUTPUT(z); - -//************************************************************* -//a coordinated set of 3 examples - + //a coordinated set of 3 examples +IMPORT Std; NameRec := RECORD - STRING5 title; - STRING20 fname; - STRING20 mname; - STRING20 lname; - STRING5 name_suffix; - STRING3 name_score; + STRING5 title := ''; + STRING20 fname := ''; + STRING20 mname := ''; + STRING20 lname := ''; + STRING5 name_suffix := ''; + STRING3 name_score := ''; END; MyRecord := RECORD UNSIGNED id; STRING uncleanedName; NameRec Name; END; -ds := DATASET('RTTEST::RowFunctionData', MyRecord, THOR); +ds := DATASET([{1,'Mr. John Smith JR'}, + {2,'Mrs. Susie Samantha Jones 3'}, + {3,'Dr. Fred Taylor SR'}],MyRecord); + STRING73 CleanPerson73(STRING inputName) := FUNCTION - suffix :=[ ' 0',' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9', + suffix :=[ ' 0',' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9', ' J',' JR',' S',' SR']; InWords := Std.Str.CleanSpaces(inputName); HasSuffix := InWords[LENGTH(TRIM(InWords))-1 ..] IN suffix; @@ -175,8 +133,8 @@ STRING73 CleanPerson73(STRING inputName) := FUNCTION END; //Example 1 - a transform to create a row from an uncleaned name -NameRec createRow(string inputName) := TRANSFORM - cleanedText := LocalAddrCleanLib.CleanPerson73(inputName); +NameRec createRow(STRING inputName) := TRANSFORM + cleanedText := CleanPerson73(inputName); SELF.title := cleanedText[1..5]; SELF.fname := cleanedText[6..25]; SELF.mname := cleanedText[26..45]; @@ -203,9 +161,9 @@ OUTPUT(y2); //Example 3 = Encapsulate the transform inside the attribute by // defining a FUNCTION. NameRec cleanedName2(STRING inputName) := FUNCTION - + NameRec createRow := TRANSFORM - cleanedText := LocalAddrCleanLib.CleanPerson73(inputName); + cleanedText := CleanPerson73(inputName); SELF.title := cleanedText[1..5]; SELF.fname := cleanedText[6..25]; SELF.mname := cleanedText[26..45]; @@ -223,21 +181,39 @@ myRecord t3(myRecord l) := TRANSFORM END; y3 := PROJECT(ds, t3(LEFT)); -OUTPUT(y3); +OUTPUT(y3); +//************************************************************* //Example using MODULE structure to return multiple values from a FUNCTION OperateOnNumbers(Number1, Number2) := FUNCTION result := MODULE EXPORT Multiplied := Number1 * Number2; EXPORT Differenced := Number1 - Number2; - EXPORT Summed := Number1 + Number2; + EXPORT Summed := Number1 + Number2; END; RETURN result; END; -OperateOnNumbers(23,22).Multiplied; -OperateOnNumbers(23,22).Differenced; -OperateOnNumbers(23,22).Summed; +OUTPUT(OperateOnNumbers(23,22).Multiplied); //506 +OUTPUT(OperateOnNumbers(23,22).Differenced); //1 +OUTPUT(OperateOnNumbers(23,22).Summed); //45 + +//************************************************************* +//a FUNCTION with side-effect Action +namesTable := FUNCTION + namesRecord := RECORD + STRING20 surname; + STRING10 forename; + INTEGER2 age := 25; + END; + o := OUTPUT('namesTable used by user <x>'); + ds1 := DATASET([{'x','y',22}],namesRecord); + RETURN WHEN(ds1,o); +END; +z := namesTable : PERSIST('z'); + //the PERSIST causes the side-effect action to execute only when the PERSIST is re-built +OUTPUT(z); + See Also: MODULE Structure, TRANSFORM Structure, member named MyDefinition, you would reference that - definition as: + definition as + MyModule.MyModuleStructure.MyDefinition: - //MyModule.MyModuleStructure.MyDefinition - -MyMod := MODULE + MyMod := MODULE SHARED x := 88; y := 42; EXPORT InMod := MODULE //nested MODULE @@ -290,41 +289,49 @@ IF (doIt, OUTPUT(customerNames.File)); Example: - EXPORT filterDataset(STRING search, BOOLEAN onlyOldies) := MODULE + namesRecord := RECORD + STRING20 surname; + STRING10 forename; + INTEGER2 age := 25; +END; +namesTable := DATASET([{'Smith','Sue',72}, + {'Jones','Joe',32}, + {'Jones','Fred',82}],namesRecord); + +filterDataset1(STRING search, BOOLEAN onlyOldies) := MODULE f := namesTable; //local to the "g" definition SHARED g := IF (onlyOldies, f(age >= 65), f); //SHARED = visible only within the structure - EXPORT included := g(surname != search); - EXPORT excluded := g(surname = search); + EXPORT included := g(surname = search); + EXPORT excluded := g(surname <> search); //EXPORT = visible outside the structure END; -filtered := filterDataset('Halliday', TRUE); -OUTPUT(filtered.included,,NAMED('Included')); -OUTPUT(filtered.excluded,,NAMED('Excluded')); - +filtered1 := filterDataset1('Smith', TRUE); +OUTPUT(filtered1.included,,NAMED('Included1')); +OUTPUT(filtered1.excluded,,NAMED('Excluded1')); + //same result, different coding style: -EXPORT filterDataset(BOOLEAN onlyOldies) := MODULE +filterDataset2(BOOLEAN onlyOldies) := MODULE f := namesTable; SHARED g := IF (onlyOldies, f(age >= 65), f); - EXPORT included(STRING search) := g(surname <> search); - EXPORT excluded(STRING search) := g(surname = search); + EXPORT included(STRING search) := g(surname = search); + EXPORT excluded(STRING search) := g(surname <> search); END; -filtered := filterDataset(TRUE); -OUTPUT(filtered.included('Halliday'),,NAMED('Included')); -OUTPUT(filterDataset(true).excluded('Halliday'),,NAMED('Excluded')); - - +filtered2 := filterDataset2(TRUE); +OUTPUT(filtered2.included('Smith'),,NAMED('Included2')); +OUTPUT(filterDataset2(true).excluded('Smith'),,NAMED('Excluded2')); + //VIRTUAL examples Mod1 := MODULE,VIRTUAL //a fully abstract module EXPORT val := 1; EXPORT func(INTEGER sc) := val * sc; END; - + Mod2 := MODULE(Mod1) //instance - EXPORT val := 3; //a concete member, overriding default value - //while func remains abstract + EXPORT val := 3; //a concete member, overriding default value + //while func remains abstract END; - + Mod3 := MODULE(Mod1) //a fully concete instance EXPORT func(INTEGER sc) := val + sc; //overrides inherited func END; @@ -332,13 +339,12 @@ OUTPUT(Mod2.func(5)); //result is 15 OUTPUT(Mod3.func(5)); //result is 6 //FORWARD example -EXPORT MyModule := MODULE, FORWARD - EXPORT INTEGER foo := bar; +MyModule := MODULE, FORWARD + EXPORT INTEGER foo := bar; //forward reference EXPORT INTEGER bar := 42; END; -MyModule.foo; - +OUTPUT(MyModule.foo); See Also: FUNCTION