blob: a8d2a6561dac189a205432af6486ccb56ca86a41 [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.ignite.table;
import java.io.IOException;
import java.io.Serializable;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import org.apache.ignite.binary.BinaryObject;
import org.jetbrains.annotations.NotNull;
/**
* Simple tuple implementation.
*/
public class TupleImpl implements Tuple, Serializable {
/** Version UID. */
private static final long serialVersionUID = 0L;
/**
* Column name -> index mapping.
* <p>
* Note: Transient because it's recoverable from {@link #colNames}.
*/
private transient Map<String, Integer> colIdxMap;
/** Columns names. */
private final List<String> colNames;
/** Columns values. */
private final List<Object> vals;
/**
* Creates tuple.
*/
public TupleImpl() {
this(new HashMap<>(), new ArrayList<>(), new ArrayList<>());
}
/**
* Creates a tuple with specified initial capacity.
*
* @param capacity Initial capacity.
*/
public TupleImpl(int capacity) {
this(new HashMap<>(capacity), new ArrayList<>(capacity), new ArrayList<>(capacity));
}
/**
* Private constructor.
*
* @param columnNameMapping Column name mapping.
* @param columnNames Column names.
* @param values Column values.
*/
private TupleImpl(Map<String, Integer> columnNameMapping, List<String> columnNames, List<Object> values) {
this.colIdxMap = columnNameMapping;
this.colNames = columnNames;
this.vals = values;
}
/**
* Copying constructor.
*
* @param tuple Tuple.
*/
public TupleImpl(@NotNull Tuple tuple) {
this(tuple.columnCount());
for (int i = 0, len = tuple.columnCount(); i < len; i++)
set(tuple.columnName(i), tuple.value(i));
}
/** {@inheritDoc} */
@Override public Tuple set(@NotNull String columnName, Object val) {
int idx = colIdxMap.computeIfAbsent(Objects.requireNonNull(columnName), name -> colIdxMap.size());
if (idx == colNames.size()) {
colNames.add(idx, columnName);
vals.add(idx, val);
} else {
colNames.set(idx, columnName);
vals.set(idx, val);
}
return this;
}
/** {@inheritDoc} */
@Override public String columnName(int columnIndex) {
Objects.checkIndex(columnIndex, vals.size());
return colNames.get(columnIndex);
}
/** {@inheritDoc} */
@Override public int columnIndex(@NotNull String columnName) {
Objects.requireNonNull(columnName);
Integer idx = colIdxMap.get(columnName);
return idx == null ? -1 : idx;
}
/** {@inheritDoc} */
@Override public int columnCount() {
return colNames.size();
}
/** {@inheritDoc} */
@Override public <T> T valueOrDefault(@NotNull String columnName, T def) {
int idx = columnIndex(columnName);
return (idx == -1) ? def : (T)vals.get(idx);
}
/** {@inheritDoc} */
@Override public <T> T value(@NotNull String columnName) {
int idx = columnIndex(columnName);
if (idx == -1)
throw new IllegalArgumentException("Column not found: columnName=" + columnName);
return (T)vals.get(idx);
}
/** {@inheritDoc} */
@Override public <T> T value(int columnIndex) {
Objects.checkIndex(columnIndex, vals.size());
return (T)vals.get(columnIndex);
}
/** {@inheritDoc} */
@Override public BinaryObject binaryObjectValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public BinaryObject binaryObjectValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public byte byteValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public byte byteValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public short shortValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public short shortValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public int intValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public int intValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public long longValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public long longValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public float floatValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public float floatValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public double doubleValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public double doubleValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public String stringValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public String stringValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public UUID uuidValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public UUID uuidValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public BitSet bitmaskValue(@NotNull String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public BitSet bitmaskValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public LocalDate dateValue(String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public LocalDate dateValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public LocalTime timeValue(String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public LocalTime timeValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public LocalDateTime datetimeValue(String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public LocalDateTime datetimeValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@Override public Instant timestampValue(String columnName) {
return value(columnName);
}
/** {@inheritDoc} */
@Override public Instant timestampValue(int columnIndex) {
return value(columnIndex);
}
/** {@inheritDoc} */
@NotNull @Override public Iterator<Object> iterator() {
return new Iterator<>() {
/** Current column index. */
private int cur = 0;
/** {@inheritDoc} */
@Override public boolean hasNext() {
return cur < vals.size();
}
/** {@inheritDoc} */
@Override public Object next() {
return hasNext() ? vals.get(cur++) : null;
}
};
}
/** {@inheritDoc} */
@Override public int hashCode() {
return Tuple.hashCode(this);
}
/** {@inheritDoc} */
@Override public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj instanceof Tuple)
return Tuple.equals(this, (Tuple)obj);
return false;
}
/**
* Deserializes object.
*
* @param in Input object stream.
* @throws IOException If failed.
* @throws ClassNotFoundException If failed.
*/
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
// Recover column name->index mapping.
colIdxMap = new HashMap<>(colNames.size());
for (int i = 0; i < colNames.size(); i++)
colIdxMap.put(colNames.get(i), i);
}
}