blob: eef5dde54f912166dc1e16ef6ce7196d7c84f844 [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.utils;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.protocol.influxdb.rpc.thrift.InfluxTSStatus;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
import org.influxdb.InfluxDBException;
import java.nio.ByteBuffer;
import java.util.List;
public class DataTypeUtils {
public static final String MSG_UNSUPPORTED_DATA_TYPE = "Unsupported data type:";
private static final byte TYPE_NULL = -2;
/**
* convert normal type to a type
*
* @param value need to convert value
* @return corresponding TSDataType
*/
public static TSDataType normalTypeToTSDataType(Object value) {
if (value instanceof Boolean) {
return TSDataType.BOOLEAN;
} else if (value instanceof Integer) {
return TSDataType.INT32;
} else if (value instanceof Long) {
return TSDataType.INT64;
} else if (value instanceof Double) {
return TSDataType.DOUBLE;
} else if (value instanceof String) {
return TSDataType.TEXT;
} else {
throw new InfluxDBException("Data type not valid: " + value.toString());
}
}
public static InfluxTSStatus RPCStatusToInfluxDBTSStatus(TSStatus status) {
InfluxTSStatus tsStatus = new InfluxTSStatus();
tsStatus.setCode(status.code);
tsStatus.setMessage(status.message);
return tsStatus;
}
public static ByteBuffer getValueBuffer(List<TSDataType> types, List<Object> values)
throws IoTDBConnectionException {
ByteBuffer buffer = ByteBuffer.allocate(calculateLength(types, values));
putValues(types, values, buffer);
return buffer;
}
private static int calculateLength(List<TSDataType> types, List<Object> values)
throws IoTDBConnectionException {
int res = 0;
for (int i = 0; i < types.size(); i++) {
// types
res += Byte.BYTES;
switch (types.get(i)) {
case BOOLEAN:
res += 1;
break;
case INT32:
res += Integer.BYTES;
break;
case INT64:
res += Long.BYTES;
break;
case FLOAT:
res += Float.BYTES;
break;
case DOUBLE:
res += Double.BYTES;
break;
case TEXT:
res += Integer.BYTES;
res += ((String) values.get(i)).getBytes(TSFileConfig.STRING_CHARSET).length;
break;
default:
throw new IoTDBConnectionException(MSG_UNSUPPORTED_DATA_TYPE + types.get(i));
}
}
return res;
}
/**
* put value in buffer
*
* @param types types list
* @param values values list
* @param buffer buffer to insert
* @throws IoTDBConnectionException
*/
private static void putValues(List<TSDataType> types, List<Object> values, ByteBuffer buffer)
throws IoTDBConnectionException {
for (int i = 0; i < values.size(); i++) {
if (values.get(i) == null) {
ReadWriteIOUtils.write(TYPE_NULL, buffer);
continue;
}
ReadWriteIOUtils.write(types.get(i), buffer);
switch (types.get(i)) {
case BOOLEAN:
ReadWriteIOUtils.write((Boolean) values.get(i), buffer);
break;
case INT32:
ReadWriteIOUtils.write((Integer) values.get(i), buffer);
break;
case INT64:
ReadWriteIOUtils.write((Long) values.get(i), buffer);
break;
case FLOAT:
ReadWriteIOUtils.write((Float) values.get(i), buffer);
break;
case DOUBLE:
ReadWriteIOUtils.write((Double) values.get(i), buffer);
break;
case TEXT:
byte[] bytes = ((String) values.get(i)).getBytes(TSFileConfig.STRING_CHARSET);
ReadWriteIOUtils.write(bytes.length, buffer);
buffer.put(bytes);
break;
default:
throw new IoTDBConnectionException(MSG_UNSUPPORTED_DATA_TYPE + types.get(i));
}
}
buffer.flip();
}
}