|
| 1 | +/*############################################################################## |
| 2 | +
|
| 3 | + HPCC SYSTEMS software Copyright (C) 2025 HPCC Systems®. |
| 4 | +
|
| 5 | + Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | + you may not use this file except in compliance with the License. |
| 7 | + You may obtain a copy of the License at |
| 8 | +
|
| 9 | + http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | +
|
| 11 | + Unless required by applicable law or agreed to in writing, software |
| 12 | + distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | + See the License for the specific language governing permissions and |
| 15 | + limitations under the License. |
| 16 | +############################################################################## */ |
| 17 | + |
| 18 | +//Test the different variants of fileposition fields |
| 19 | +// - fixed and variable with records |
| 20 | +// - 3 different index types |
| 21 | +// - 2 different ways of defining the index (from dataset or from record) |
| 22 | + |
| 23 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 24 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 25 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 26 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 27 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 28 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 29 | + |
| 30 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 31 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 32 | +//version compressionType='legacy',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 33 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 34 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 35 | +//version compressionType='legacy',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 36 | + |
| 37 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 38 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 39 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 40 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 41 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 42 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 43 | + |
| 44 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 45 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 46 | +//version compressionType='inplace',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 47 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 48 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 49 | +//version compressionType='inplace',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 50 | + |
| 51 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 52 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 53 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 54 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=false |
| 55 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=false |
| 56 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=false |
| 57 | + |
| 58 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 59 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 60 | +//version compressionType='hybrid',variableWidth=false,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 61 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=false,hasFilePos=false,fromDataset=true |
| 62 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=false,hasFilePos=true,fromDataset=true |
| 63 | +//version compressionType='hybrid',variableWidth=true,zeroFilePos=true,hasFilePos=true,fromDataset=true |
| 64 | + |
| 65 | +import ^ as root; |
| 66 | +import $.setup; |
| 67 | +import Std.File AS FileServices; |
| 68 | + |
| 69 | +compressionType := #IFDEFINED(root.compressionType, 'hybrid'); |
| 70 | +variableWidth := #IFDEFINED(root.variableWidth, true); |
| 71 | +zeroFilePos := #IFDEFINED(root.zeroFilePos, true); |
| 72 | +hasFilePos := #IFDEFINED(root.hasFilePos, true); |
| 73 | +fromDataset := #IFDEFINED(root.fromDataset, true); |
| 74 | + |
| 75 | +idxRecord := RECORD |
| 76 | + unsigned uid |
| 77 | + => |
| 78 | + unsigned uid2; |
| 79 | +#if (variableWidth) |
| 80 | + string pad := '<pad>'; |
| 81 | +#end |
| 82 | +#if (not zeroFilePos) |
| 83 | + unsigned8 uid3; |
| 84 | +#end |
| 85 | +END; |
| 86 | + |
| 87 | +numParents := 50; |
| 88 | + |
| 89 | +ds := DATASET(numParents, |
| 90 | + TRANSFORM(idxRecord, |
| 91 | + SELF.uid := COUNTER; |
| 92 | + SELF.uid2 := HASH32(COUNTER); |
| 93 | +#if (variableWidth) |
| 94 | + SELF.pad := 'Arfle Barfle Gloop!!'[1..COUNTER%20]; |
| 95 | +#end |
| 96 | +#if (not zeroFilePos) |
| 97 | + SELF.uid3 := COUNTER; |
| 98 | +#end |
| 99 | + ), DISTRIBUTED); |
| 100 | + |
| 101 | + |
| 102 | +prefix := setup.Files(false, false).indexPrefix + WORKUNIT; |
| 103 | +indexName := prefix+'_fpos_index'; |
| 104 | + |
| 105 | +#if (fromDataset) |
| 106 | +i := INDEX(ds, { uid }, {ds}, indexName, compressed(compressionType),FILEPOSITION(hasFilePos)); |
| 107 | +#else |
| 108 | +i := INDEX(idxRecord, indexName, compressed(compressionType),FILEPOSITION(hasFilePos)); |
| 109 | +#end |
| 110 | + |
| 111 | +// NOTE: use recordof(i) in the following to ensure that any implicit file position is included |
| 112 | +lhs := PROJECT(SORT(ds, uid2), TRANSFORM(recordof(i), SELF := LEFT)); |
| 113 | + |
| 114 | +matchRecord := RECORD |
| 115 | + recordof(i) l; |
| 116 | + recordof(i) r; |
| 117 | +END; |
| 118 | + |
| 119 | +j := JOIN(lhs, i, LEFT.uid=RIGHT.uid, TRANSFORM(matchRecord, SELF.l := LEFT; SELF.r := RIGHT), KEEP(1)); |
| 120 | + |
| 121 | +SEQUENTIAL( |
| 122 | + BUILD(i, ds, OVERWRITE); |
| 123 | + OUTPUT(j(l != r)); |
| 124 | + |
| 125 | + // Clean-up |
| 126 | + FileServices.DeleteLogicalFile(indexName) |
| 127 | +); |
0 commit comments