blob: d5702e7004ad35678f1f36b0165ebea5affeb0cc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.iotdb.db.storageengine.dataregion.wal.utils;
import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
import org.apache.iotdb.tsfile.file.metadata.IDeviceID;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
import org.apache.iotdb.tsfile.utils.Binary;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
import java.util.Map;
/** Like {@link org.apache.iotdb.tsfile.utils.ReadWriteIOUtils}. */
public class WALWriteUtils {
public static final int BOOLEAN_LEN = ReadWriteIOUtils.BOOLEAN_LEN;
public static final int SHORT_LEN = ReadWriteIOUtils.SHORT_LEN;
public static final int INT_LEN = ReadWriteIOUtils.INT_LEN;
public static final int LONG_LEN = ReadWriteIOUtils.LONG_LEN;
public static final int DOUBLE_LEN = ReadWriteIOUtils.DOUBLE_LEN;
public static final int FLOAT_LEN = ReadWriteIOUtils.FLOAT_LEN;
private static final int NO_BYTE_TO_READ = -1;
private WALWriteUtils() {}
/** Write a byte to byteBuffer according to flag. If flag is true, write 1, else write 0. */
public static int write(Boolean flag, IWALByteBufferView buffer) {
byte a;
if (Boolean.TRUE.equals(flag)) {
a = 1;
} else {
a = 0;
}
buffer.put(a);
return BOOLEAN_LEN;
}
/**
* Write a byte n to byteBuffer.
*
* @return The number of bytes used to represent a {@code byte} value in two's complement binary
* form.
*/
public static int write(byte n, IWALByteBufferView buffer) {
buffer.put(n);
return Byte.BYTES;
}
/**
* Write a short n to byteBuffer.
*
* @return The number of bytes used to represent n.
*/
public static int write(short n, IWALByteBufferView buffer) {
buffer.putShort(n);
return SHORT_LEN;
}
/**
* Write a short n to byteBuffer.
*
* @return The number of bytes used to represent n.
*/
public static int write(Binary n, IWALByteBufferView buffer) {
buffer.putInt(n.getLength());
buffer.put(n.getValues());
return INT_LEN + n.getLength();
}
/**
* Write a int n to byteBuffer.
*
* @return The number of bytes used to represent n.
*/
public static int write(int n, IWALByteBufferView buffer) {
buffer.putInt(n);
return INT_LEN;
}
/** Write a long n to byteBuffer. */
public static int write(long n, IWALByteBufferView buffer) {
buffer.putLong(n);
return LONG_LEN;
}
/** Write a float n to byteBuffer. */
public static int write(float n, IWALByteBufferView buffer) {
buffer.putFloat(n);
return FLOAT_LEN;
}
/** Write a double n to byteBuffer. */
public static int write(double n, IWALByteBufferView buffer) {
buffer.putDouble(n);
return DOUBLE_LEN;
}
/**
* Write string to byteBuffer.
*
* @return the length of string represented by byte[].
*/
public static int write(String s, IWALByteBufferView buffer) {
if (s == null) {
return write(NO_BYTE_TO_READ, buffer);
}
int len = 0;
byte[] bytes = s.getBytes();
len += write(bytes.length, buffer);
buffer.put(bytes);
len += bytes.length;
return len;
}
/**
* Write IDeviceID to byteBuffer.
*
* @return the length of string represented by byte[].
*/
public static int write(IDeviceID deviceID, IWALByteBufferView buffer) {
if (deviceID == null) {
return write(NO_BYTE_TO_READ, buffer);
}
int len = 0;
byte[] bytes = deviceID.getBytes();
len += write(bytes.length, buffer);
buffer.put(bytes);
len += bytes.length;
return len;
}
/** TSDataType. */
public static int write(TSDataType dataType, IWALByteBufferView buffer) {
byte n = dataType.serialize();
return write(n, buffer);
}
/** TSEncoding. */
public static int write(TSEncoding encoding, IWALByteBufferView buffer) {
byte n = encoding.serialize();
return write(n, buffer);
}
/** CompressionType. */
public static int write(CompressionType compressionType, IWALByteBufferView buffer) {
byte n = compressionType.serialize();
return write(n, buffer);
}
/** MeasurementSchema. */
public static int write(MeasurementSchema measurementSchema, IWALByteBufferView buffer) {
int len = 0;
len += write(measurementSchema.getMeasurementId(), buffer);
len += write(measurementSchema.getType(), buffer);
len += write(measurementSchema.getEncodingType(), buffer);
len += write(measurementSchema.getCompressor(), buffer);
Map<String, String> props = measurementSchema.getProps();
if (props == null) {
len += write(0, buffer);
} else {
len += write(props.size(), buffer);
for (Map.Entry<String, String> entry : props.entrySet()) {
len += write(entry.getKey(), buffer);
len += write(entry.getValue(), buffer);
}
}
return len;
}
public static int sizeToWrite(MeasurementSchema measurementSchema) {
int byteLen = 0;
byteLen += ReadWriteIOUtils.sizeToWrite(measurementSchema.getMeasurementId());
byteLen += 3 * Byte.BYTES;
Map<String, String> props = measurementSchema.getProps();
byteLen += Integer.BYTES;
if (props != null) {
for (Map.Entry<String, String> entry : props.entrySet()) {
byteLen += ReadWriteIOUtils.sizeToWrite(entry.getKey());
byteLen += ReadWriteIOUtils.sizeToWrite(entry.getValue());
}
}
return byteLen;
}
}