diff --git a/SAS/OTDB/sql/instanciateTree_func.sql b/SAS/OTDB/sql/instanciateTree_func.sql index 9a5e75e8600055e1cdbee7a69451cb4681793180..0850fd2656c47566ebb2965bbf608eb35d77f041 100644 --- a/SAS/OTDB/sql/instanciateTree_func.sql +++ b/SAS/OTDB/sql/instanciateTree_func.sql @@ -42,31 +42,78 @@ CREATE OR REPLACE FUNCTION resolveVHparam(INT4, TEXT) vNodeName VARCHAR(200); vParamName VARCHAR(200); vRemainder VARCHAR(200); + vOrgArray VARCHAR(200); + vElem VARCHAR(100); + vAnswer TEXT; + vIsArray BOOLEAN; + vSize INTEGER; vRecord RECORD; BEGIN ---RAISE WARNING \'resolveVHparam(%,%)\', $1, $2; - vDotpos := strpos($2, \'.\'); - vNodeName := substr($2, 3, vDotpos-3); - vParamName := substr($2, vDotpos+1); + vDotpos := strpos($2, \'.\'); -- >>a.b.c or <<a + IF vDotpos < 1 THEN + RETURN $2; + END IF; + vNodeName := substr($2, 3, vDotpos-3); -- a + vParamName := substr($2, vDotpos+1); -- b.c vDotpos := strpos(vParamName, \'.\'); IF vDotpos > 0 THEN - vRemainder := substr(vParamName, vDotPos); - vParamName := substr(vParamName, 1, vDotPos-1); + vRemainder := substr(vParamName, vDotPos); -- .c + vParamName := substr(vParamName, 1, vDotPos-1); -- b ELSE vRemainder := \'\'; END IF; ---RAISE WARNING \'resolveVHparam: % : % : %\', vNodeName, vParamName, vRemainder; + -- does paramname end in [] ? + IF rtrim(vParamName, \'[]\') != vParamName THEN + vIsArray := true; + vParamName := rtrim(vParamName, \'[]\'); + ELSE + vIsArray := false; + END IF; + -- Get parameter definition SELECT * INTO vRecord FROM getVICNodeDef ($1, vNodeName, vParamName); + + IF NOT FOUND THEN + RAISE EXCEPTION \'Parameter % from Node % not found\', vNodeName, vParamName; + END IF; - IF vRemainder = \'\' THEN - RETURN vRecord.limits; + IF vIsArray THEN + IF vRemainder = \'\' THEN + -- calc size of array + RETURN calcArraySize(vRecord.limits); + ELSE + -- reference array + -- create an array with same size as current vRecord.limits array + -- while rereferencing the elements of the vRecord.limits array. + vAnswer := \'[\'; + vOrgArray := btrim(vRecord.limits, \'[] \'); + vSize := calcArraySize(vRecord.limits); + FOR i IN 1..vSize LOOP + -- get clean name of element + vElem := btrim(split_part(vOrgArray, \',\', i), \' \'); + -- make sure it begins with << + IF substr(vElem,1,2) != \'<<\' THEN + vElem := \'<<\' || vElem; + END IF; + -- resolve value + vElem := resolveVHparam($1, vElem || vRemainder); + -- add to array + vAnswer := vAnswer || vElem || \',\'; + END LOOP; + -- finish array and return result. + vAnswer := rtrim(vAnswer, \',\') || \']\'; + RETURN vAnswer; + END IF; ELSE - vRecord.limits := vRecord.limits || vRemainder; - RETURN resolveVHparam($1, vRecord.limits); + IF vRemainder = \'\' THEN + RETURN vRecord.limits; + ELSE + vRecord.limits := vRecord.limits || vRemainder; + RETURN resolveVHparam($1, vRecord.limits); + END IF; END IF; END; ' LANGUAGE plpgsql; diff --git a/SAS/OTDB/sql/misc_func.sql b/SAS/OTDB/sql/misc_func.sql index 98ac181db098c58a77cac88400216a05eb24226c..d9fa433263025c633d421cd40a15fc867323a8e0 100644 --- a/SAS/OTDB/sql/misc_func.sql +++ b/SAS/OTDB/sql/misc_func.sql @@ -210,3 +210,31 @@ CREATE OR REPLACE FUNCTION isReference(TEXT) END; ' LANGUAGE plpgsql IMMUTABLE; +-- +-- calcArraySize (arraystring) +-- +-- Authorisation: n/a +-- +-- Tables: none +-- +-- Types: none +-- +CREATE OR REPLACE FUNCTION calcArraySize(TEXT) + RETURNS TEXT AS ' + DECLARE + vSize INTEGER; + vArray TEXT; + + BEGIN + vArray := ltrim($1,\'[ \'); + vArray := rtrim(vArray,\'] \'); + vSize := 0; + WHILE length(vArray) > 0 LOOP + -- remove element + vArray := ltrim(vArray, \'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "[]{}+%<>.\'); + vSize := vSize + 1; -- count element + vArray := ltrim(vArray, \',\'); -- strip comma + END LOOP; + RETURN vSize; + END; +' LANGUAGE plpgsql IMMUTABLE; diff --git a/SAS/OTDB/test/tVTtree.in b/SAS/OTDB/test/tVTtree.in index 09214fdcf77357958513c613f372b8424b2d4345..8c28911c5f3d8be39a650155f4613cc14cda46c8 100644 --- a/SAS/OTDB/test/tVTtree.in +++ b/SAS/OTDB/test/tVTtree.in @@ -138,6 +138,17 @@ par systemClock I dbl MHz 0 0 200 - 'systemclock' par channelWidth I dbl Hz 0 0 762.939453125 - 'width of the channels' par subbandWidth I dbl kHz 0 0 195.3125 - 'width of the 512 subbands' +# -- Clock160 -- +# name vers qual constr. descr. +#------------------------------------------------------------------------------ +node Clock160 1.0.0 test 'node constraint' '160 MHz clock' + +# name dir. type unit prun. vm value constr. descr. +#------------------------------------------------------------------------------ +par systemClock I dbl MHz 0 0 160 - 'systemclock' +par channelWidth I dbl Hz 0 0 610.3515625 - 'width of the channels' +par subbandWidth I dbl kHz 0 0 156.25 - 'width of the 512 subbands' + # -- Observation -- # name vers qual constr. descr. #------------------------------------------------------------------------------ @@ -164,5 +175,6 @@ node TopNode 1.0.0 test 'node constraint' 'Toplevel node' #------------------------------------------------------------------------------ uses 'Observation' 1.0.0 test 0..1 "x" uses 'Clock200' 1.0.0 test 1 "x" +uses 'Clock160' 1.0.0 test 1 "x"