17
17
package com .netflix .hollow .core .read .engine .object ;
18
18
19
19
import static com .netflix .hollow .core .HollowConstants .ORDINAL_NONE ;
20
+ import static com .netflix .hollow .core .read .engine .object .HollowObjectTypeDataElements .copyRecord ;
21
+ import static com .netflix .hollow .core .read .engine .object .HollowObjectTypeDataElements .varLengthSize ;
20
22
21
23
import com .netflix .hollow .core .memory .SegmentedByteArray ;
22
24
import com .netflix .hollow .core .memory .encoding .FixedLengthElementArray ;
@@ -71,7 +73,11 @@ public void populateHistory() {
71
73
int ordinal = iter .next ();
72
74
while (ordinal != ORDINAL_NONE ) {
73
75
ordinalMapping .put (ordinal , nextOrdinal );
74
- copyRecord (ordinal );
76
+
77
+ int shard = ordinal & shardNumberMask ;
78
+ int shardOrdinal = ordinal >> shardOrdinalShift ;
79
+ copyRecord (historicalDataElements , nextOrdinal , stateEngineDataElements [shard ], shardOrdinal , currentWriteVarLengthDataPointers );
80
+ nextOrdinal ++;
75
81
76
82
ordinal = iter .next ();
77
83
}
@@ -109,7 +115,9 @@ private void populateStats() {
109
115
110
116
for (int i =0 ;i <totalVarLengthSizes .length ;i ++) {
111
117
if (stateEngineDataElements [0 ].varLengthData [i ] != null ) {
112
- totalVarLengthSizes [i ] += varLengthSize (ordinal , i );
118
+ int shard = ordinal & shardNumberMask ;
119
+ int shardOrdinal = ordinal >> shardOrdinalShift ;
120
+ totalVarLengthSizes [i ] += varLengthSize (stateEngineDataElements [shard ], shardOrdinal , i );
113
121
}
114
122
}
115
123
@@ -125,66 +133,11 @@ private void populateStats() {
125
133
historicalDataElements .bitsPerField [i ] = (64 - Long .numberOfLeadingZeros (totalVarLengthSizes [i ] + 1 )) + 1 ;
126
134
}
127
135
128
- historicalDataElements .nullValueForField [i ] = (1L << historicalDataElements .bitsPerField [i ]) - 1 ;
136
+ historicalDataElements .nullValueForField [i ] = historicalDataElements . bitsPerField [ i ] == 64 ? - 1L : (1L << historicalDataElements .bitsPerField [i ]) - 1 ;
129
137
historicalDataElements .bitOffsetPerField [i ] = historicalDataElements .bitsPerRecord ;
130
138
historicalDataElements .bitsPerRecord += historicalDataElements .bitsPerField [i ];
131
139
}
132
140
133
141
ordinalMapping = new IntMap (removedEntryCount );
134
142
}
135
-
136
- private long varLengthSize (int ordinal , int fieldIdx ) {
137
- int shard = ordinal & shardNumberMask ;
138
- int shardOrdinal = ordinal >> shardOrdinalShift ;
139
-
140
- int numBitsForField = stateEngineDataElements [shard ].bitsPerField [fieldIdx ];
141
- long currentBitOffset = ((long )stateEngineDataElements [shard ].bitsPerRecord * shardOrdinal ) + stateEngineDataElements [shard ].bitOffsetPerField [fieldIdx ];
142
- long endByte = stateEngineDataElements [shard ].fixedLengthData .getElementValue (currentBitOffset , numBitsForField ) & (1L << (numBitsForField - 1 )) - 1 ;
143
- long startByte = shardOrdinal != 0 ? stateEngineDataElements [shard ].fixedLengthData .getElementValue (currentBitOffset - stateEngineDataElements [shard ].bitsPerRecord , numBitsForField ) & (1L << (numBitsForField - 1 )) - 1 : 0 ;
144
-
145
- return endByte - startByte ;
146
- }
147
-
148
- private void copyRecord (int ordinal ) {
149
- int shard = ordinal & shardNumberMask ;
150
- int shardOrdinal = ordinal >> shardOrdinalShift ;
151
-
152
- for (int i =0 ;i <historicalDataElements .schema .numFields ();i ++) {
153
- if (historicalDataElements .varLengthData [i ] == null ) {
154
- long value = stateEngineDataElements [shard ].fixedLengthData .getLargeElementValue (((long )shardOrdinal * stateEngineDataElements [shard ].bitsPerRecord ) + stateEngineDataElements [shard ].bitOffsetPerField [i ], stateEngineDataElements [shard ].bitsPerField [i ]);
155
- historicalDataElements .fixedLengthData .setElementValue (((long )nextOrdinal * historicalDataElements .bitsPerRecord ) + historicalDataElements .bitOffsetPerField [i ], historicalDataElements .bitsPerField [i ], value );
156
- } else {
157
- long fromStartByte = varLengthStartByte (shard , shardOrdinal , i );
158
- long fromEndByte = varLengthEndByte (shard , shardOrdinal , i );
159
- long size = fromEndByte - fromStartByte ;
160
-
161
- historicalDataElements .fixedLengthData .setElementValue (((long )nextOrdinal * historicalDataElements .bitsPerRecord ) + historicalDataElements .bitOffsetPerField [i ], historicalDataElements .bitsPerField [i ], currentWriteVarLengthDataPointers [i ] + size );
162
- historicalDataElements .varLengthData [i ].copy (stateEngineDataElements [shard ].varLengthData [i ], fromStartByte , currentWriteVarLengthDataPointers [i ], size );
163
-
164
- currentWriteVarLengthDataPointers [i ] += size ;
165
- }
166
- }
167
-
168
- nextOrdinal ++;
169
- }
170
-
171
- private long varLengthStartByte (int shard , int translatedOrdinal , int fieldIdx ) {
172
- if (translatedOrdinal == 0 )
173
- return 0 ;
174
-
175
- int numBitsForField = stateEngineDataElements [shard ].bitsPerField [fieldIdx ];
176
- long currentBitOffset = ((long )stateEngineDataElements [shard ].bitsPerRecord * translatedOrdinal ) + stateEngineDataElements [shard ].bitOffsetPerField [fieldIdx ];
177
- long startByte = stateEngineDataElements [shard ].fixedLengthData .getElementValue (currentBitOffset - stateEngineDataElements [shard ].bitsPerRecord , numBitsForField ) & (1L << (numBitsForField - 1 )) - 1 ;
178
-
179
- return startByte ;
180
- }
181
-
182
- private long varLengthEndByte (int shard , int translatedOrdinal , int fieldIdx ) {
183
- int numBitsForField = stateEngineDataElements [shard ].bitsPerField [fieldIdx ];
184
- long currentBitOffset = ((long )stateEngineDataElements [shard ].bitsPerRecord * translatedOrdinal ) + stateEngineDataElements [shard ].bitOffsetPerField [fieldIdx ];
185
- long endByte = stateEngineDataElements [shard ].fixedLengthData .getElementValue (currentBitOffset , numBitsForField ) & (1L << (numBitsForField - 1 )) - 1 ;
186
-
187
- return endByte ;
188
- }
189
-
190
143
}
0 commit comments