blob: 1fb9d6931ba7187b416d57b4bfba3537a1999f9d [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.atlas.repository.memory;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.booleans.BooleanArrayList;
import it.unimi.dsi.fastutil.bytes.ByteArrayList;
import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
import it.unimi.dsi.fastutil.floats.FloatArrayList;
import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.longs.LongArrayList;
import it.unimi.dsi.fastutil.shorts.ShortArrayList;
import org.apache.atlas.repository.RepositoryException;
import org.apache.atlas.typesystem.persistence.Id;
import org.apache.atlas.typesystem.persistence.StructInstance;
import org.apache.atlas.typesystem.types.AttributeInfo;
import org.apache.atlas.typesystem.types.DataTypes;
import org.apache.atlas.typesystem.types.IConstructableType;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Deprecated
public class AttributeStores {
private static final Object NULL_VAL = new Object();
static IAttributeStore createStore(AttributeInfo i) throws RepositoryException {
switch (i.dataType().getTypeCategory()) {
case PRIMITIVE:
if (i.dataType() == DataTypes.BOOLEAN_TYPE) {
return new BooleanAttributeStore(i);
} else if (i.dataType() == DataTypes.BYTE_TYPE) {
return new ByteAttributeStore(i);
} else if (i.dataType() == DataTypes.SHORT_TYPE) {
return new ShortAttributeStore(i);
} else if (i.dataType() == DataTypes.INT_TYPE) {
return new IntAttributeStore(i);
} else if (i.dataType() == DataTypes.LONG_TYPE) {
return new LongAttributeStore(i);
} else if (i.dataType() == DataTypes.FLOAT_TYPE) {
return new FloatAttributeStore(i);
} else if (i.dataType() == DataTypes.DOUBLE_TYPE) {
return new DoubleAttributeStore(i);
} else if (i.dataType() == DataTypes.BIGINTEGER_TYPE) {
return new BigIntStore(i);
} else if (i.dataType() == DataTypes.BIGDECIMAL_TYPE) {
return new BigDecimalStore(i);
} else if (i.dataType() == DataTypes.DATE_TYPE) {
return new DateStore(i);
} else if (i.dataType() == DataTypes.STRING_TYPE) {
return new StringStore(i);
} else if (i.dataType() == DataTypes.STRING_TYPE) {
return new StringStore(i);
} else {
throw new RepositoryException(String.format("Unknown datatype %s", i.dataType()));
}
case ENUM:
return new IntAttributeStore(i);
case ARRAY:
return new ImmutableListStore(i);
case MAP:
return new ImmutableMapStore(i);
case STRUCT:
return new StructStore(i);
case CLASS:
return new IdStore(i);
default:
throw new RepositoryException(String.format("Unknown Category for datatype %s", i.dataType()));
}
}
static abstract class AbstractAttributeStore implements IAttributeStore {
final BooleanArrayList nullList;
final Map<Integer, Map<String, Object>> hiddenVals;
AttributeInfo attrInfo;
AbstractAttributeStore(AttributeInfo attrInfo) {
this.attrInfo = attrInfo;
this.nullList = new BooleanArrayList();
hiddenVals = new HashMap<>();
}
final void setNull(int pos, boolean flag) {
nullList.set(pos, flag);
}
final boolean getNull(int pos) {
return nullList.get(pos);
}
void storeHiddenVals(int pos, IConstructableType type, StructInstance instance) throws RepositoryException {
List<String> attrNames = type.getNames(attrInfo);
Map<String, Object> m = hiddenVals.get(pos);
if (m == null) {
m = new HashMap<>();
hiddenVals.put(pos, m);
}
for (int i = 2; i < attrNames.size(); i++) {
String attrName = attrNames.get(i);
int nullPos = instance.fieldMapping().fieldNullPos.get(attrName);
int colPos = instance.fieldMapping().fieldPos.get(attrName);
if (instance.nullFlags[nullPos]) {
m.put(attrName, NULL_VAL);
} else {
//m.put(attrName, instance.bools[colPos]);
store(instance, colPos, attrName, m);
}
}
}
void loadHiddenVals(int pos, IConstructableType type, StructInstance instance) throws RepositoryException {
List<String> attrNames = type.getNames(attrInfo);
Map<String, Object> m = hiddenVals.get(pos);
for (int i = 2; i < attrNames.size(); i++) {
String attrName = attrNames.get(i);
int nullPos = instance.fieldMapping().fieldNullPos.get(attrName);
int colPos = instance.fieldMapping().fieldPos.get(attrName);
Object val = m == null ? NULL_VAL : m.get(attrName);
if (val == NULL_VAL) {
instance.nullFlags[nullPos] = true;
} else {
instance.nullFlags[nullPos] = false;
load(instance, colPos, val);
}
}
}
@Override
public void store(int pos, IConstructableType type, StructInstance instance) throws RepositoryException {
List<String> attrNames = type.getNames(attrInfo);
String attrName = attrNames.get(0);
int nullPos = instance.fieldMapping().fieldNullPos.get(attrName);
int colPos = instance.fieldMapping().fieldPos.get(attrName);
nullList.set(pos, instance.nullFlags[nullPos]);
if (pos == nullList.size()) {
nullList.add(instance.nullFlags[nullPos]);
} else {
nullList.set(pos, instance.nullFlags[nullPos]);
}
//list.set(pos, instance.bools[colPos]);
store(instance, colPos, pos);
if (attrNames.size() > 1) {
storeHiddenVals(pos, type, instance);
}
}
@Override
public void load(int pos, IConstructableType type, StructInstance instance) throws RepositoryException {
List<String> attrNames = type.getNames(attrInfo);
String attrName = attrNames.get(0);
int nullPos = instance.fieldMapping().fieldNullPos.get(attrName);
int colPos = instance.fieldMapping().fieldPos.get(attrName);
if (nullList.get(pos)) {
instance.nullFlags[nullPos] = true;
} else {
instance.nullFlags[nullPos] = false;
load(instance, colPos, pos);
}
if (attrNames.size() > 1) {
loadHiddenVals(pos, type, instance);
}
}
/*
* store the value from colPos in instance into the list.
*/
protected abstract void store(StructInstance instance, int colPos, int pos) throws RepositoryException;
/*
* load the value from pos in list into colPos in instance.
*/
protected abstract void load(StructInstance instance, int colPos, int pos) throws RepositoryException;
/*
* store the value from colPos in map as attrName
*/
protected abstract void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m);
/*
* load the val into colPos in instance.
*/
protected abstract void load(StructInstance instance, int colPos, Object val);
}
static abstract class PrimitiveAttributeStore extends AbstractAttributeStore implements IAttributeStore {
public PrimitiveAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
}
}
static class BooleanAttributeStore extends PrimitiveAttributeStore {
final BooleanArrayList list;
BooleanAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new BooleanArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.bools[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.bools[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.bools[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.bools[colPos] = (Boolean) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class ByteAttributeStore extends PrimitiveAttributeStore {
final ByteArrayList list;
ByteAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new ByteArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.bytes[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.bytes[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.bytes[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.bytes[colPos] = (Byte) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class ShortAttributeStore extends PrimitiveAttributeStore {
final ShortArrayList list;
ShortAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new ShortArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.shorts[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.shorts[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.shorts[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.shorts[colPos] = (Short) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class IntAttributeStore extends PrimitiveAttributeStore {
final IntArrayList list;
IntAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new IntArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.ints[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.ints[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.ints[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.ints[colPos] = (Integer) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class LongAttributeStore extends PrimitiveAttributeStore {
final LongArrayList list;
LongAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new LongArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.longs[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.longs[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.longs[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.longs[colPos] = (Long) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class FloatAttributeStore extends PrimitiveAttributeStore {
final FloatArrayList list;
FloatAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new FloatArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.floats[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.floats[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.floats[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.floats[colPos] = (Float) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static class DoubleAttributeStore extends PrimitiveAttributeStore {
final DoubleArrayList list;
DoubleAttributeStore(AttributeInfo attrInfo) {
super(attrInfo);
this.list = new DoubleArrayList();
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.doubles[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.doubles[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.doubles[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.doubles[colPos] = (Double) val;
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
list.size(pos + 1);
nullList.size(pos + 1);
}
}
static abstract class ObjectAttributeStore<T> extends AbstractAttributeStore {
final ArrayList<T> list;
ObjectAttributeStore(Class<T> cls, AttributeInfo attrInfo) {
super(attrInfo);
this.list = Lists.newArrayList((T) null);
}
@Override
public void ensureCapacity(int pos) throws RepositoryException {
while (list.size() < pos + 1) {
list.add(null);
}
nullList.size(pos + 1);
}
}
static class BigIntStore extends ObjectAttributeStore<BigInteger> {
public BigIntStore(AttributeInfo attrInfo) {
super(BigInteger.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.bigIntegers[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.bigIntegers[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.bigIntegers[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.bigIntegers[colPos] = (BigInteger) val;
}
}
static class BigDecimalStore extends ObjectAttributeStore<BigDecimal> {
public BigDecimalStore(AttributeInfo attrInfo) {
super(BigDecimal.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.bigDecimals[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.bigDecimals[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.bigDecimals[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.bigDecimals[colPos] = (BigDecimal) val;
}
}
static class DateStore extends ObjectAttributeStore<Date> {
public DateStore(AttributeInfo attrInfo) {
super(Date.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.dates[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.dates[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.dates[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.dates[colPos] = (Date) val;
}
}
static class StringStore extends ObjectAttributeStore<String> {
public StringStore(AttributeInfo attrInfo) {
super(String.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.strings[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.strings[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.strings[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.strings[colPos] = (String) val;
}
}
static class IdStore extends ObjectAttributeStore<Id> {
public IdStore(AttributeInfo attrInfo) {
super(Id.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.ids[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.ids[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.ids[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.ids[colPos] = (Id) val;
}
}
static class ImmutableListStore extends ObjectAttributeStore<ImmutableList> {
public ImmutableListStore(AttributeInfo attrInfo) {
super(ImmutableList.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.arrays[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.arrays[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.arrays[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.arrays[colPos] = (ImmutableList) val;
}
}
static class ImmutableMapStore extends ObjectAttributeStore<ImmutableMap> {
public ImmutableMapStore(AttributeInfo attrInfo) {
super(ImmutableMap.class, attrInfo);
}
protected void store(StructInstance instance, int colPos, int pos) {
list.set(pos, instance.maps[colPos]);
}
protected void load(StructInstance instance, int colPos, int pos) {
instance.maps[colPos] = list.get(pos);
}
protected void store(StructInstance instance, int colPos, String attrName, Map<String, Object> m) {
m.put(attrName, instance.maps[colPos]);
}
protected void load(StructInstance instance, int colPos, Object val) {
instance.maps[colPos] = (ImmutableMap) val;
}
}
}