// hpccsystems.com

/******************
 Multi-line comment
******************/

import std.math.job;
IMPORT Str;

/****************** TYPES ******************/

R1 := RECORD
    integer1  F1;
    UNSIGNED4 F2;
    STRING100 F3;
    REAL4     R1;
    REAL8     R2;
    REAL9     R2; // This should not match a type
    boolean   B1;
    decimal23 D1;
    udecimal3 D2;
END;

D1 := dataset('RTTEMP::SomeFile',R1,THOR);
D1 := DATASET('RTTEMP::SomeFile',R1,THOR);

/****************** TEMPLATES ******************/

#append
#APPEND
#inmodule

/****************** NUMBERS AND STRINGS ******************/

ArcCosine := acos(0.55);

DATA2 MyHexString := x'0D0A'; // a 2-byte hexadecimal string
MyDataString := D'abcd'; // same as: (DATA)'abcd'
MyUnicodeString := U'abcd'; // same as: (UNICODE)'abcd'
MyUnicodeString := U'abcd\353'; // becomes 'abcd�'
MyVarString := V'abcd'; // same as: (VARSTRING)'abcd'
MyQString := Q'ABCD'; // same as: (QSTRING)'ABCD'

MyInt1 := 10; // value of MyInt1 is the INTEGER value 10
MyInt2 := 0x0A; // value of MyInt2 is the INTEGER value 10
MyInt3 := 0Ax; // value of MyInt3 is the INTEGER value 10
MyInt4 := 0b1010; // value of MyInt4 is the INTEGER value 10
MyInt5 := 1010b; // value of MyInt5 is the INTEGER value 10
MyReal := 10.0; // value of MyReal is the REAL value 10.0
MyRea2 := 1.0e1; // value of MyReal2 is the REAL value 10.0
MyRea3 := 1.0E1; // value of MyReal3 is the REAL value 10.0

MyFunc(STRING1 val, SET OF STRING1 S=ALL) := val IN S;

eMails := REGEXFINDSET('\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}' , sampleStr);
eMails2 := REGEXFINDSET(U'\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}', sampleStr2);

//check for presence in passed set, if passed

SET OF INTEGER4 MySet := IF(SomeCondition=TRUE,[88888,99999,66666,33333,55555],ALL);
MyRecs := MyFile(Zip IN MySet);

str := '---\'---';

/****************** BLOCKS (not working currently) ******************/

INTEGER addone(INTEGER p) := EMBED(Python)
# Python code that returns one more than the value passed to it
if p < 10:
    return p+1
else:
    return 0
ENDEMBED;

REAL8 colors_should_be_different_here := 10.5;

BEGINC++
    #option action
    struct tm localt; // localtime in "tm" structure
    time_t timeinsecs; // variable to store time in secs
    time(&timeinsecs);
    localtime_r(&timeinsecs,&localt);
    char temp[15];
    strftime(temp , 15, "%Y%m%d%H%M%S", &localt); // Formats the localtime to YYYYMMDDhhmmss
    strncpy(__result, temp, 14);
ENDC++;

REAL8 colors_should_be_different_here := 10.5;

AddOne(num) := FUNCTIONMACRO
    LOCAL numPlus := num + 1; //LOCAL required here
    RETURN numPlus;
ENDMACRO;

/****************** NESTED ******************/
MyMod := MODULE
    SHARED x := 88;
    y := 42;
    EXPORT InMod := MODULE //nested MODULE
        EXPORT Val1 := x + 10;
        EXPORT Val2 := y + 10;
    END;
END;

/****************** PATTERNS ******************/

PATTERN ws := PATTERN('[ \t\r\n]');
PATTERN arb := PATTERN('[-!.,\t a-zA-Z0-9]')+;
PATTERN number := PATTERN('[0-9]')+;
PATTERN age := '(' number OPT('/I') ')';
PATTERN role := '[' arb ']';
PATTERN m_rank := '<' number '>';
PATTERN actor := arb OPT(ws '(I)' ws);

MyFunc(STRING1 val, SET OF STRING1 S=ALL) := val IN S;

/****************** JOINS *******************/
Bld1 := BUILD(AlphaKey ,OVERWRITE);
Bld2 := BUILD(SeqKey,OVERWRITE);
peopleRecord := RECORD
    INTEGER8 id;
    STRING20 addr;
END;

peopleDataset := DATASET([{3000,'LONDON'},{3500,'SMITH'},
{30,'TAYLOR'}], peopleRecord);

joinedRecord := RECORD
    PtblRec;
    peopleRecord;
END;

joinedRecord doJoin(peopleRecord l, Ptbl r) := TRANSFORM
    SELF := l;
    SELF := r;
END;

FilledRecs1 := JOIN(peopleDataset, Ptbl,LEFT.id=RIGHT.seq,
                    doJoin(LEFT,RIGHT), KEYED(SeqKey));
FilledRecs2 := JOIN(peopleDataset, Ptbl,LEFT.addr=RIGHT.Lname,
                    doJoin(LEFT,RIGHT), KEYED(AlphaKey));
                    
SEQUENTIAL(PtblOut,Bld1,Bld2,OUTPUT(FilledRecs1),OUTPUT(FilledRecs2))

/****************** JOINS *******************/
OUTPUT(d, {Label := Subject, Value := Result}, NAMED('BarChart'));
