blob: 4536896751ee53d080909af0cec8ffdd31e5e74e [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.engine.memtable;
import org.apache.iotdb.db.utils.datastructure.TVList;
import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.Binary;
import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
public class WritableMemChunk implements IWritableMemChunk {
private MeasurementSchema schema;
private TVList list;
public WritableMemChunk(MeasurementSchema schema, TVList list) {
this.schema = schema;
this.list = list;
}
@Override
public void write(long insertTime, Object objectValue) {
switch (schema.getType()) {
case BOOLEAN:
putBoolean(insertTime, (boolean) objectValue);
break;
case INT32:
putInt(insertTime, (int) objectValue);
break;
case INT64:
putLong(insertTime, (long) objectValue);
break;
case FLOAT:
putFloat(insertTime, (float) objectValue);
break;
case DOUBLE:
putDouble(insertTime, (double) objectValue);
break;
case TEXT:
putBinary(insertTime, (Binary) objectValue);
break;
default:
throw new UnSupportedDataTypeException("Unsupported data type:" + schema.getType());
}
}
@Override
public void write(long[] times, Object valueList, TSDataType dataType, int start, int end) {
switch (dataType) {
case BOOLEAN:
boolean[] boolValues = (boolean[]) valueList;
putBooleans(times, boolValues, start, end);
break;
case INT32:
int[] intValues = (int[]) valueList;
putInts(times, intValues, start, end);
break;
case INT64:
long[] longValues = (long[]) valueList;
putLongs(times, longValues, start, end);
break;
case FLOAT:
float[] floatValues = (float[]) valueList;
putFloats(times, floatValues, start, end);
break;
case DOUBLE:
double[] doubleValues = (double[]) valueList;
putDoubles(times, doubleValues, start, end);
break;
case TEXT:
Binary[] binaryValues = (Binary[]) valueList;
putBinaries(times, binaryValues, start, end);
break;
default:
throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
}
}
@Override
public void putLong(long t, long v) {
list.putLong(t, v);
}
@Override
public void putInt(long t, int v) {
list.putInt(t, v);
}
@Override
public void putFloat(long t, float v) {
list.putFloat(t, v);
}
@Override
public void putDouble(long t, double v) {
list.putDouble(t, v);
}
@Override
public void putBinary(long t, Binary v) {
list.putBinary(t, v);
}
@Override
public void putBoolean(long t, boolean v) {
list.putBoolean(t, v);
}
@Override
public void putLongs(long[] t, long[] v, int start, int end) {
list.putLongs(t, v, start, end);
}
@Override
public void putInts(long[] t, int[] v, int start, int end) {
list.putInts(t, v, start, end);
}
@Override
public void putFloats(long[] t, float[] v, int start, int end) {
list.putFloats(t, v, start, end);
}
@Override
public void putDoubles(long[] t, double[] v, int start, int end) {
list.putDoubles(t, v, start, end);
}
@Override
public void putBinaries(long[] t, Binary[] v, int start, int end) {
list.putBinaries(t, v, start, end);
}
@Override
public void putBooleans(long[] t, boolean[] v, int start, int end) {
list.putBooleans(t, v, start, end);
}
@Override
public synchronized TVList getSortedTVListForQuery() {
sortTVList();
// increase reference count
list.increaseReferenceCount();
return list;
}
private void sortTVList() {
// check reference count
if ((list.getReferenceCount() > 0 && !list.isSorted())) {
list = list.clone();
}
if (!list.isSorted()) {
list.sort();
}
}
@Override
public synchronized TVList getSortedTVListForFlush() {
sortTVList();
return list;
}
@Override
public TVList getTVList() {
return list;
}
@Override
public long count() {
return list.size();
}
@Override
public MeasurementSchema getSchema() {
return schema;
}
@Override
public long getMinTime() {
return list.getMinTime();
}
@Override
public int delete(long lowerBound, long upperBound) {
return list.delete(lowerBound, upperBound);
}
@Override
public String toString() {
int size = getSortedTVListForQuery().size();
StringBuilder out = new StringBuilder("MemChunk Size: " + size + System.lineSeparator());
if (size != 0) {
out.append("Data type:").append(schema.getType()).append(System.lineSeparator());
out.append("First point:")
.append(getSortedTVListForQuery().getTimeValuePair(0))
.append(System.lineSeparator());
out.append("Last point:")
.append(getSortedTVListForQuery().getTimeValuePair(size - 1))
.append(System.lineSeparator());
}
return out.toString();
}
}