/** * 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; } } }