blob: 76320813906a53c7e830c5299f9984010eea957e [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.parquet.example.data.simple;
import java.util.ArrayList;
import java.util.List;
import org.apache.parquet.example.data.Group;
import org.apache.parquet.io.api.Binary;
import org.apache.parquet.io.api.RecordConsumer;
import org.apache.parquet.schema.GroupType;
import org.apache.parquet.schema.Type;
public class SimpleGroup extends Group {
private final GroupType schema;
private final List<Object>[] data;
@SuppressWarnings("unchecked")
public SimpleGroup(GroupType schema) {
this.schema = schema;
this.data = new List[schema.getFields().size()];
for (int i = 0; i < schema.getFieldCount(); i++) {
this.data[i] = new ArrayList<>();
}
}
@Override
public String toString() {
return toString("");
}
private StringBuilder appendToString(StringBuilder builder, String indent) {
int i = 0;
for (Type field : schema.getFields()) {
String name = field.getName();
List<Object> values = data[i];
++i;
if (values != null && !values.isEmpty()) {
for (Object value : values) {
builder.append(indent).append(name);
if (value == null) {
builder.append(": NULL\n");
} else if (value instanceof Group) {
builder.append('\n');
((SimpleGroup) value).appendToString(builder, indent + " ");
} else {
builder.append(": ").append(value).append('\n');
}
}
}
}
return builder;
}
public String toString(String indent) {
StringBuilder builder = new StringBuilder();
appendToString(builder, indent);
return builder.toString();
}
@Override
public Group addGroup(int fieldIndex) {
SimpleGroup g = new SimpleGroup(schema.getType(fieldIndex).asGroupType());
add(fieldIndex, g);
return g;
}
public Object getObject(String field, int index) {
return getObject(getType().getFieldIndex(field), index);
}
public Object getObject(int fieldIndex, int index) {
Object wrapped = getValue(fieldIndex, index);
// Unwrap to Java standard object, if possible
if (wrapped instanceof BooleanValue) {
return ((BooleanValue) wrapped).getBoolean();
} else if (wrapped instanceof IntegerValue) {
return ((IntegerValue) wrapped).getInteger();
} else if (wrapped instanceof LongValue) {
return ((LongValue) wrapped).getLong();
} else if (wrapped instanceof Int96Value) {
return ((Int96Value) wrapped).getInt96();
} else if (wrapped instanceof FloatValue) {
return ((FloatValue) wrapped).getFloat();
} else if (wrapped instanceof DoubleValue) {
return ((DoubleValue) wrapped).getDouble();
} else if (wrapped instanceof BinaryValue) {
return ((BinaryValue) wrapped).getBinary();
} else {
return wrapped;
}
}
@Override
public Group getGroup(int fieldIndex, int index) {
return (Group) getValue(fieldIndex, index);
}
private Object getValue(int fieldIndex, int index) {
List<Object> list;
try {
list = data[fieldIndex];
} catch (IndexOutOfBoundsException e) {
throw new RuntimeException(
"not found " + fieldIndex + "(" + schema.getFieldName(fieldIndex) + ") in group:\n" + this);
}
try {
return list.get(index);
} catch (IndexOutOfBoundsException e) {
throw new RuntimeException("not found " + fieldIndex + "(" + schema.getFieldName(fieldIndex)
+ ") element number " + index + " in group:\n" + this);
}
}
private void add(int fieldIndex, Primitive value) {
Type type = schema.getType(fieldIndex);
List<Object> list = data[fieldIndex];
if (!type.isRepetition(Type.Repetition.REPEATED) && !list.isEmpty()) {
throw new IllegalStateException(
"field " + fieldIndex + " (" + type.getName() + ") can not have more than one value: " + list);
}
list.add(value);
}
@Override
public int getFieldRepetitionCount(int fieldIndex) {
List<Object> list = data[fieldIndex];
return list == null ? 0 : list.size();
}
@Override
public String getValueToString(int fieldIndex, int index) {
return String.valueOf(getValue(fieldIndex, index));
}
@Override
public String getString(int fieldIndex, int index) {
return ((BinaryValue) getValue(fieldIndex, index)).getString();
}
@Override
public int getInteger(int fieldIndex, int index) {
return ((IntegerValue) getValue(fieldIndex, index)).getInteger();
}
@Override
public long getLong(int fieldIndex, int index) {
return ((LongValue) getValue(fieldIndex, index)).getLong();
}
@Override
public double getDouble(int fieldIndex, int index) {
return ((DoubleValue) getValue(fieldIndex, index)).getDouble();
}
@Override
public float getFloat(int fieldIndex, int index) {
return ((FloatValue) getValue(fieldIndex, index)).getFloat();
}
@Override
public boolean getBoolean(int fieldIndex, int index) {
return ((BooleanValue) getValue(fieldIndex, index)).getBoolean();
}
@Override
public Binary getBinary(int fieldIndex, int index) {
return ((BinaryValue) getValue(fieldIndex, index)).getBinary();
}
public NanoTime getTimeNanos(int fieldIndex, int index) {
return NanoTime.fromInt96((Int96Value) getValue(fieldIndex, index));
}
@Override
public Binary getInt96(int fieldIndex, int index) {
return ((Int96Value) getValue(fieldIndex, index)).getInt96();
}
@Override
public void add(int fieldIndex, int value) {
add(fieldIndex, new IntegerValue(value));
}
@Override
public void add(int fieldIndex, long value) {
add(fieldIndex, new LongValue(value));
}
@Override
public void add(int fieldIndex, String value) {
add(fieldIndex, new BinaryValue(Binary.fromString(value)));
}
@Override
public void add(int fieldIndex, NanoTime value) {
add(fieldIndex, value.toInt96());
}
@Override
public void add(int fieldIndex, boolean value) {
add(fieldIndex, new BooleanValue(value));
}
@Override
public void add(int fieldIndex, Binary value) {
switch (getType().getType(fieldIndex).asPrimitiveType().getPrimitiveTypeName()) {
case BINARY:
case FIXED_LEN_BYTE_ARRAY:
add(fieldIndex, new BinaryValue(value));
break;
case INT96:
add(fieldIndex, new Int96Value(value));
break;
default:
throw new UnsupportedOperationException(
getType().asPrimitiveType().getName() + " not supported for Binary");
}
}
@Override
public void add(int fieldIndex, float value) {
add(fieldIndex, new FloatValue(value));
}
@Override
public void add(int fieldIndex, double value) {
add(fieldIndex, new DoubleValue(value));
}
@Override
public void add(int fieldIndex, Group value) {
data[fieldIndex].add(value);
}
@Override
public GroupType getType() {
return schema;
}
@Override
public void writeValue(int field, int index, RecordConsumer recordConsumer) {
((Primitive) getValue(field, index)).writeValue(recordConsumer);
}
}