blob: 42d8c96cfa499b917fa8842873059359420d9680 [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.tsfile.utils;
import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import java.io.Serializable;
import java.util.Arrays;
public abstract class TsPrimitiveType implements Serializable {
/**
* get tsPrimitiveType by resultDataType.
*
* @param dataType given TsDataType
*/
public static TsPrimitiveType getByType(TSDataType dataType) {
switch (dataType) {
case BOOLEAN:
return new TsPrimitiveType.TsBoolean();
case INT32:
return new TsPrimitiveType.TsInt();
case INT64:
return new TsPrimitiveType.TsLong();
case FLOAT:
return new TsPrimitiveType.TsFloat();
case DOUBLE:
return new TsPrimitiveType.TsDouble();
case TEXT:
return new TsPrimitiveType.TsBinary();
case VECTOR:
return new TsPrimitiveType.TsVector();
default:
throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
}
}
/**
* get tsPrimitiveType by resultDataType and initial value.
*
* @param dataType given TsDataType
* @param v initial value
*/
public static TsPrimitiveType getByType(TSDataType dataType, Object v) {
switch (dataType) {
case BOOLEAN:
return new TsPrimitiveType.TsBoolean((boolean) v);
case INT32:
return new TsPrimitiveType.TsInt((int) v);
case INT64:
return new TsPrimitiveType.TsLong((long) v);
case FLOAT:
return new TsPrimitiveType.TsFloat((float) v);
case DOUBLE:
return new TsPrimitiveType.TsDouble((double) v);
case TEXT:
return new TsPrimitiveType.TsBinary((Binary) v);
case VECTOR:
return new TsPrimitiveType.TsVector((TsPrimitiveType[]) v);
default:
throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
}
}
public boolean getBoolean() {
throw new UnsupportedOperationException("getBoolean() is not supported for current sub-class");
}
public int getInt() {
throw new UnsupportedOperationException("getInt() is not supported for current sub-class");
}
public long getLong() {
throw new UnsupportedOperationException("getLong() is not supported for current sub-class");
}
public float getFloat() {
throw new UnsupportedOperationException("getFloat() is not supported for current sub-class");
}
public double getDouble() {
throw new UnsupportedOperationException("getDouble() is not supported for current sub-class");
}
public Binary getBinary() {
throw new UnsupportedOperationException("getBinary() is not supported for current sub-class");
}
public TsPrimitiveType[] getVector() {
throw new UnsupportedOperationException("getVector() is not supported for current sub-class");
}
public void setBoolean(boolean val) {
throw new UnsupportedOperationException("setBoolean() is not supported for current sub-class");
}
public void setInt(int val) {
throw new UnsupportedOperationException("setInt() is not supported for current sub-class");
}
public void setLong(long val) {
throw new UnsupportedOperationException("setLong() is not supported for current sub-class");
}
public void setFloat(float val) {
throw new UnsupportedOperationException("setFloat() is not supported for current sub-class");
}
public void setDouble(double val) {
throw new UnsupportedOperationException("setDouble() is not supported for current sub-class");
}
public void setBinary(Binary val) {
throw new UnsupportedOperationException("setBinary() is not supported for current sub-class");
}
public void setVector(TsPrimitiveType[] val) {
throw new UnsupportedOperationException("setVector() is not supported for current sub-class");
}
public abstract void setObject(Object val);
public abstract void reset();
/**
* get the size of one instance of current class.
*
* @return size of one instance of current class
*/
public abstract int getSize();
public abstract Object getValue();
public abstract String getStringValue();
public abstract TSDataType getDataType();
@Override
public String toString() {
return getStringValue();
}
@Override
public boolean equals(Object object) {
return (object instanceof TsPrimitiveType)
&& (((TsPrimitiveType) object).getValue().equals(getValue()));
}
@Override
public int hashCode() {
return getValue().hashCode();
}
public static class TsBoolean extends TsPrimitiveType {
private boolean value;
public TsBoolean() {}
public TsBoolean(boolean value) {
this.value = value;
}
@Override
public boolean getBoolean() {
return value;
}
@Override
public void setBoolean(boolean val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Boolean) {
setBoolean((Boolean) val);
return;
}
throw new UnSupportedDataTypeException("TsBoolean can only be set Boolean value");
}
@Override
public void reset() {
value = false;
}
@Override
public int getSize() {
return 4 + 1;
}
@Override
public Object getValue() {
return getBoolean();
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.BOOLEAN;
}
@Override
public int hashCode() {
return Boolean.hashCode(value);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsBoolean) {
TsBoolean anotherTs = (TsBoolean) anObject;
return value == anotherTs.value;
}
return false;
}
}
public static class TsInt extends TsPrimitiveType {
private int value;
public TsInt() {}
public TsInt(int value) {
this.value = value;
}
@Override
public int getInt() {
return value;
}
@Override
public void setInt(int val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Integer) {
setInt((Integer) val);
return;
}
throw new UnSupportedDataTypeException("TsInt can only be set Integer value");
}
@Override
public void reset() {
value = 0;
}
@Override
public int getSize() {
return 4 + 4;
}
@Override
public Object getValue() {
return getInt();
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.INT32;
}
@Override
public int hashCode() {
return Integer.hashCode(value);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsInt) {
TsInt anotherTs = (TsInt) anObject;
return value == anotherTs.value;
}
return false;
}
}
public static class TsLong extends TsPrimitiveType {
private long value;
public TsLong() {}
public TsLong(long value) {
this.value = value;
}
@Override
public long getLong() {
return value;
}
@Override
public void setLong(long val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Long) {
setLong((Long) val);
return;
}
throw new UnSupportedDataTypeException("TsLong can only be set Long value");
}
@Override
public void reset() {
value = 0;
}
@Override
public int getSize() {
return 4 + 8;
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.INT64;
}
@Override
public Object getValue() {
return getLong();
}
@Override
public int hashCode() {
return Long.hashCode(value);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsLong) {
TsLong anotherTs = (TsLong) anObject;
return value == anotherTs.value;
}
return false;
}
}
public static class TsFloat extends TsPrimitiveType {
private float value;
public TsFloat() {}
public TsFloat(float value) {
this.value = value;
}
@Override
public float getFloat() {
return value;
}
@Override
public void setFloat(float val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Float) {
setFloat((Float) val);
return;
}
throw new UnSupportedDataTypeException("TsFloat can only be set float value");
}
@Override
public void reset() {
value = 0;
}
@Override
public int getSize() {
return 4 + 4;
}
@Override
public Object getValue() {
return getFloat();
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.FLOAT;
}
@Override
public int hashCode() {
return Float.hashCode(value);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsFloat) {
TsFloat anotherTs = (TsFloat) anObject;
return value == anotherTs.value;
}
return false;
}
}
public static class TsDouble extends TsPrimitiveType {
private double value;
public TsDouble() {}
public TsDouble(double value) {
this.value = value;
}
@Override
public double getDouble() {
return value;
}
@Override
public void setDouble(double val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Double) {
setDouble((Double) val);
return;
}
throw new UnSupportedDataTypeException("TsDouble can only be set Double value");
}
@Override
public void reset() {
value = 0.0;
}
@Override
public int getSize() {
return 4 + 8;
}
@Override
public Object getValue() {
return getDouble();
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.DOUBLE;
}
@Override
public int hashCode() {
return Double.hashCode(value);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsDouble) {
TsDouble anotherTs = (TsDouble) anObject;
return value == anotherTs.value;
}
return false;
}
}
public static class TsBinary extends TsPrimitiveType {
private Binary value;
public TsBinary() {}
public TsBinary(Binary value) {
this.value = value;
}
@Override
public Binary getBinary() {
return value;
}
@Override
public void setBinary(Binary val) {
this.value = val;
}
@Override
public void setObject(Object val) {
if (val instanceof Binary) {
setBinary((Binary) val);
return;
}
throw new UnSupportedDataTypeException("TsBinary can only be set Binary value");
}
@Override
public void reset() {
value = null;
}
@Override
public int getSize() {
return 4 + 4 + value.getLength();
}
@Override
public Object getValue() {
return getBinary();
}
@Override
public String getStringValue() {
return String.valueOf(value);
}
@Override
public TSDataType getDataType() {
return TSDataType.TEXT;
}
@Override
public int hashCode() {
return value.hashCode();
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsBinary) {
TsBinary anotherTs = (TsBinary) anObject;
return value.equals(anotherTs.value);
}
return false;
}
}
public static class TsVector extends TsPrimitiveType {
private TsPrimitiveType[] values;
public TsVector() {}
public TsVector(TsPrimitiveType[] values) {
this.values = values;
}
@Override
public TsPrimitiveType[] getVector() {
return values;
}
@Override
public void setVector(TsPrimitiveType[] vals) {
this.values = vals;
}
@Override
public void setObject(Object val) {
if (val instanceof TsPrimitiveType[]) {
setVector((TsPrimitiveType[]) val);
return;
}
throw new UnSupportedDataTypeException("TsVector can only be set TsPrimitiveType[] value");
}
@Override
public void reset() {
values = null;
}
@Override
public int getSize() {
int size = 0;
for (TsPrimitiveType type : values) {
if (type != null) {
size += type.getSize();
}
}
// object header + array object header
return 4 + 4 + size;
}
@Override
public Object getValue() {
return getVector();
}
@Override
public String getStringValue() {
StringBuilder builder = new StringBuilder("[");
builder.append(values[0] == null ? "null" : values[0].getStringValue());
for (int i = 1; i < values.length; i++) {
builder.append(", ").append(values[i] == null ? "null" : values[i].getStringValue());
}
builder.append("]");
return builder.toString();
}
@Override
public TSDataType getDataType() {
return TSDataType.VECTOR;
}
@Override
public int hashCode() {
return Arrays.hashCode(values);
}
@Override
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof TsVector) {
TsVector anotherTs = (TsVector) anObject;
if (anotherTs.values.length != this.values.length) {
return false;
}
for (int i = 0; i < this.values.length; i++) {
if (!values[i].equals(anotherTs.values[i])) {
return false;
}
}
return true;
}
return false;
}
}
}