alien2.ecl 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2021 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. import lib_stringlib;
  14. import $.setup;
  15. prefix := setup.Files(false, false).FilePrefix + __TARGET_PLATFORM__ + '::';
  16. extractXStringLength(data x, unsigned len) := transfer(((data4)(x[1..len])), unsigned4);
  17. //A pretty weird type example - a length prefixed string, where the number of bytes used for the length is configurable...
  18. xstring(unsigned len) := type
  19. export integer physicallength(data x) := extractXStringLength(x, len)+len;
  20. export string load(data x) := (string)x[(len+1)..extractXStringLength(x, len)+len];
  21. export data store(string x) := transfer(length(x), data4)[1..len]+(data)x;
  22. end;
  23. dstring(string del) := TYPE
  24. export integer physicallength(string s) := StringLib.StringUnboundedUnsafeFind(s,del)+length(del)-1;
  25. export string load(string s) := s[1..StringLib.StringUnboundedUnsafeFind(s,del)-1];
  26. export string store(string s) := s+del; // Untested (vlength output generally broken)
  27. END;
  28. alienString := xstring(4);
  29. alienVarString := dstring('\000');
  30. namesRecord := RECORD
  31. string surname;
  32. string forename;
  33. varstring addr;
  34. string4 extra;
  35. varstring extra2;
  36. END;
  37. namesRecordEx := RECORD(namesRecord)
  38. unsigned fpos{virtual(fileposition)};
  39. string filename{virtual(logicalfilename)};
  40. unsigned lfpos{virtual(localfileposition)};
  41. END;
  42. reducedNamesRecordEx := namesRecordEx - [addr, extra, lfpos];
  43. alienRecord := RECORD
  44. alienString surname;
  45. alienString forename;
  46. alienVarString addr;
  47. string4 extra;
  48. alienVarString extra2;
  49. END;
  50. alienRecordEx := RECORD(alienRecord)
  51. unsigned fpos{virtual(fileposition)};
  52. string filename{virtual(logicalfilename)};
  53. unsigned lfpos{virtual(localfileposition)};
  54. END;
  55. filenameRaw := prefix+'alientest_raw';
  56. filenameAlien := prefix+'alientest_alien';
  57. namesTable := dataset([
  58. {'Hawthorn','Gavin','Slapdash Lane', 'ABCD', ''},
  59. {'Hawthorn','Mia','Slapdash Lane', '1234', 'groan'},
  60. {'Smithe','Pru','Ashley Road', 'PLEH', 'grown' },
  61. {'X','Z','Mars','!EM ', 'help'}], namesRecord);
  62. p := PROJECT(namesTable, TRANSFORM(alienRecord, SELF := LEFT));
  63. sequential(
  64. //Output the files two ways - one using alien data types, and one using the equiavlent built in types.
  65. output(namesTable,,filenameRaw, thor, overwrite);
  66. output(p,,filenameAlien, thor, overwrite);
  67. //Now read the files back in different ways
  68. output(DATASET(filenameRaw, namesRecordEx, THOR),,NAMED('RawRaw'));
  69. output(DATASET(filenameRaw, alienRecordEx, THOR, __OPTION__(LEGACY),HINT(layoutTranslation('alwaysEcl'))),,NAMED('RawAlien'));
  70. output(DATASET(filenameAlien, namesRecordEx, THOR,HINT(layoutTranslation('alwaysEcl'))),,NAMED('AlienRaw'));
  71. output(DATASET(filenameAlien, alienRecordEx, THOR, __OPTION__(LEGACY)),,NAMED('AlienAlien'));
  72. //Read the files in and also project them - to test mixing projection and untranslatable file formats works correctly
  73. output(PROJECT(DATASET(filenameRaw, namesRecordEx, THOR), transform(reducedNamesRecordEx, SELF := LEFT)),,NAMED('ProjectRawRaw'));
  74. output(PROJECT(DATASET(filenameRaw, alienRecordEx, THOR, __OPTION__(LEGACY),HINT(layoutTranslation('alwaysEcl'))), transform(reducedNamesRecordEx, SELF := LEFT)),,NAMED('ProjectRawAlien'));
  75. output(PROJECT(DATASET(filenameAlien, namesRecordEx, THOR,HINT(layoutTranslation('alwaysEcl'))), transform(reducedNamesRecordEx, SELF := LEFT)),,NAMED('ProjectAlienRaw'));
  76. output(PROJECT(DATASET(filenameAlien, alienRecordEx, THOR, __OPTION__(LEGACY)), transform(reducedNamesRecordEx, SELF := LEFT)),,NAMED('ProjectAlienAlien'))
  77. );