|
31 | 31 | import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId; |
32 | 32 | import org.apache.iotdb.db.storageengine.dataregion.memtable.DeviceIDFactory; |
33 | 33 | import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView; |
| 34 | +import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils; |
34 | 35 | import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils; |
35 | 36 |
|
| 37 | +import org.apache.tsfile.common.conf.TSFileConfig; |
36 | 38 | import org.apache.tsfile.enums.TSDataType; |
37 | 39 | import org.apache.tsfile.exception.NotImplementedException; |
38 | 40 | import org.apache.tsfile.file.metadata.IDeviceID; |
| 41 | +import org.apache.tsfile.utils.ReadWriteIOUtils; |
39 | 42 | import org.apache.tsfile.write.schema.MeasurementSchema; |
40 | 43 |
|
41 | 44 | import java.io.DataInputStream; |
42 | 45 | import java.io.DataOutputStream; |
43 | 46 | import java.io.IOException; |
44 | 47 | import java.nio.ByteBuffer; |
45 | 48 | import java.util.Arrays; |
| 49 | +import java.util.HashMap; |
46 | 50 | import java.util.List; |
| 51 | +import java.util.Map; |
47 | 52 | import java.util.Objects; |
48 | 53 | import java.util.stream.Collectors; |
49 | 54 |
|
@@ -213,6 +218,102 @@ protected void serializeAttributes(DataOutputStream stream) throws IOException { |
213 | 218 | throw new NotImplementedException("serializeAttributes of InsertNode is not implemented"); |
214 | 219 | } |
215 | 220 |
|
| 221 | + protected static int serializeString(String value, ByteBuffer buffer) { |
| 222 | + if (value == null) { |
| 223 | + return ReadWriteIOUtils.write(-1, buffer); |
| 224 | + } |
| 225 | + byte[] bytes = value.getBytes(TSFileConfig.STRING_CHARSET); |
| 226 | + int len = ReadWriteIOUtils.write(bytes.length, buffer); |
| 227 | + buffer.put(bytes); |
| 228 | + return len + bytes.length; |
| 229 | + } |
| 230 | + |
| 231 | + protected static int serializeString(String value, DataOutputStream stream) throws IOException { |
| 232 | + if (value == null) { |
| 233 | + return ReadWriteIOUtils.write(-1, stream); |
| 234 | + } |
| 235 | + byte[] bytes = value.getBytes(TSFileConfig.STRING_CHARSET); |
| 236 | + int len = ReadWriteIOUtils.write(bytes.length, stream); |
| 237 | + stream.write(bytes); |
| 238 | + return len + bytes.length; |
| 239 | + } |
| 240 | + |
| 241 | + protected static String deserializeString(ByteBuffer buffer) { |
| 242 | + int strLength = ReadWriteIOUtils.readInt(buffer); |
| 243 | + if (strLength < 0) { |
| 244 | + return null; |
| 245 | + } else if (strLength == 0) { |
| 246 | + return ""; |
| 247 | + } |
| 248 | + byte[] bytes = new byte[strLength]; |
| 249 | + buffer.get(bytes); |
| 250 | + return new String(bytes, TSFileConfig.STRING_CHARSET); |
| 251 | + } |
| 252 | + |
| 253 | + protected static void serializeMeasurementSchema( |
| 254 | + MeasurementSchema measurementSchema, ByteBuffer buffer) { |
| 255 | + serializeString(measurementSchema.getMeasurementId(), buffer); |
| 256 | + ReadWriteIOUtils.write(measurementSchema.getTypeInByte(), buffer); |
| 257 | + ReadWriteIOUtils.write(measurementSchema.getEncodingType().serialize(), buffer); |
| 258 | + ReadWriteIOUtils.write(measurementSchema.getCompressor().serialize(), buffer); |
| 259 | + serializeProps(measurementSchema.getProps(), buffer); |
| 260 | + } |
| 261 | + |
| 262 | + protected static void serializeMeasurementSchema( |
| 263 | + MeasurementSchema measurementSchema, DataOutputStream stream) throws IOException { |
| 264 | + serializeString(measurementSchema.getMeasurementId(), stream); |
| 265 | + ReadWriteIOUtils.write(measurementSchema.getTypeInByte(), stream); |
| 266 | + ReadWriteIOUtils.write(measurementSchema.getEncodingType().serialize(), stream); |
| 267 | + ReadWriteIOUtils.write(measurementSchema.getCompressor().serialize(), stream); |
| 268 | + serializeProps(measurementSchema.getProps(), stream); |
| 269 | + } |
| 270 | + |
| 271 | + protected static MeasurementSchema deserializeMeasurementSchema(ByteBuffer buffer) { |
| 272 | + String measurementId = deserializeString(buffer); |
| 273 | + byte type = ReadWriteIOUtils.readByte(buffer); |
| 274 | + byte encoding = ReadWriteIOUtils.readByte(buffer); |
| 275 | + byte compressor = ReadWriteIOUtils.readByte(buffer); |
| 276 | + Map<String, String> props = deserializeProps(buffer); |
| 277 | + return new MeasurementSchema(measurementId, type, encoding, compressor, props); |
| 278 | + } |
| 279 | + |
| 280 | + private static void serializeProps(Map<String, String> props, ByteBuffer buffer) { |
| 281 | + if (props == null) { |
| 282 | + ReadWriteIOUtils.write(0, buffer); |
| 283 | + return; |
| 284 | + } |
| 285 | + ReadWriteIOUtils.write(props.size(), buffer); |
| 286 | + for (Map.Entry<String, String> entry : props.entrySet()) { |
| 287 | + serializeString(entry.getKey(), buffer); |
| 288 | + serializeString(entry.getValue(), buffer); |
| 289 | + } |
| 290 | + } |
| 291 | + |
| 292 | + private static void serializeProps(Map<String, String> props, DataOutputStream stream) |
| 293 | + throws IOException { |
| 294 | + if (props == null) { |
| 295 | + ReadWriteIOUtils.write(0, stream); |
| 296 | + return; |
| 297 | + } |
| 298 | + ReadWriteIOUtils.write(props.size(), stream); |
| 299 | + for (Map.Entry<String, String> entry : props.entrySet()) { |
| 300 | + serializeString(entry.getKey(), stream); |
| 301 | + serializeString(entry.getValue(), stream); |
| 302 | + } |
| 303 | + } |
| 304 | + |
| 305 | + private static Map<String, String> deserializeProps(ByteBuffer buffer) { |
| 306 | + int size = ReadWriteIOUtils.readInt(buffer); |
| 307 | + if (size <= 0) { |
| 308 | + return null; |
| 309 | + } |
| 310 | + Map<String, String> props = new HashMap<>(); |
| 311 | + for (int i = 0; i < size; i++) { |
| 312 | + props.put(deserializeString(buffer), deserializeString(buffer)); |
| 313 | + } |
| 314 | + return props; |
| 315 | + } |
| 316 | + |
216 | 317 | // region Serialization methods for WAL |
217 | 318 | /** Serialized size of measurement schemas, ignoring failed time series */ |
218 | 319 | protected int serializeMeasurementSchemasSize() { |
@@ -244,15 +345,15 @@ protected void serializeMeasurementSchemasToWAL(IWALByteBufferView buffer) { |
244 | 345 | */ |
245 | 346 | protected void deserializeMeasurementSchemas(DataInputStream stream) throws IOException { |
246 | 347 | for (int i = 0; i < measurements.length; i++) { |
247 | | - measurementSchemas[i] = MeasurementSchema.deserializeFrom(stream); |
| 348 | + measurementSchemas[i] = WALReadUtils.readMeasurementSchema(stream); |
248 | 349 | measurements[i] = measurementSchemas[i].getMeasurementId(); |
249 | 350 | dataTypes[i] = measurementSchemas[i].getType(); |
250 | 351 | } |
251 | 352 | } |
252 | 353 |
|
253 | 354 | protected void deserializeMeasurementSchemas(ByteBuffer buffer) { |
254 | 355 | for (int i = 0; i < measurements.length; i++) { |
255 | | - measurementSchemas[i] = MeasurementSchema.deserializeFrom(buffer); |
| 356 | + measurementSchemas[i] = WALReadUtils.readMeasurementSchema(buffer); |
256 | 357 | measurements[i] = measurementSchemas[i].getMeasurementId(); |
257 | 358 | } |
258 | 359 | } |
|
0 commit comments