package org.reldb.rel.v0.storage.relvars;
import java.lang.reflect.InvocationTargetException;
import org.reldb.rel.exceptions.ExceptionSemantic;
import org.reldb.rel.v0.generator.Generator;
import org.reldb.rel.v0.storage.RelDatabase;
import org.reldb.rel.v0.storage.tables.TableCustom;
import org.reldb.rel.v0.storage.tables.TableExternal;
import org.reldb.rel.v0.storage.tables.TableExternal.DuplicateHandling;
import org.reldb.rel.v0.values.RelTupleFilter;
import org.reldb.rel.v0.values.RelTupleMap;
import org.reldb.rel.v0.values.TupleFilter;
import org.reldb.rel.v0.values.TupleIterator;
import org.reldb.rel.v0.values.ValueRelation;
import org.reldb.rel.v0.values.ValueTuple;
import org.reldb.rel.v0.version.Version;
import org.reldb.rel.v0.vm.Context;
import org.reldb.rel.v0.vm.Operator;
public class RelvarExternal extends RelvarGlobal {
private TableExternal table;
public RelvarExternal(String name, RelDatabase database, Generator generator, RelvarCustomMetadata metadata, DuplicateHandling duplicates) {
super(name, database);
String tableName = metadata.tableClassName();
String type = metadata.getType();
try {
table = (TableCustom)Class.forName("org.reldb.rel.v" + Version.getDatabaseVersion() + ".storage.relvars.external." + type.toLowerCase() + "." + tableName).getConstructors()[0].newInstance(name, metadata, generator, duplicates);
} catch (ClassNotFoundException e) {
throw new ExceptionSemantic("RS0223: VAR " + name + " of type " + type + " could not be found");
} catch (ClassCastException e) {
throw new ExceptionSemantic("RS0224: VAR " + name + " of type " + type + " does not extend TableCustom");
} catch (InvocationTargetException e) {
throw new ExceptionSemantic("RS0455: VAR " + name + " of type " + type + " could not be loaded due to " + e.getCause());
} catch (Exception e) {
throw new ExceptionSemantic("RS0456: VAR " + name + " of type " + type + " could not be loaded due to " + e);
}
}
public long getCardinality(Generator generator) {
return table.getCardinality();
}
public boolean contains(Generator generator, ValueTuple tuple) {
return table.contains(generator, tuple);
}
public ValueTuple getTupleForKey(Generator generator, ValueTuple tuple) {
return table.getTupleForKey(generator, tuple);
}
public void setValue(ValueRelation relation) {
table.setValue(this, relation);
}
public long insert(Generator generator, ValueTuple tuple) {
return table.insert(generator, tuple);
}
public long insert(Generator generator, ValueRelation relation) {
return table.insert(generator, relation);
}
public long insertNoDuplicates(Generator generator, ValueRelation relation) {
return table.insertNoDuplicates(generator, relation);
}
// Delete all tuples
public void purge() {
table.purge();
}
// Delete given tuple
public void delete(Generator generator, ValueTuple tuple) {
table.delete(generator, tuple);
}
// Delete selected tuples
public long delete(Context context, Operator whereTupleOperator) {
return table.delete(context.getGenerator(), new RelTupleFilter(context, whereTupleOperator));
}
// Delete selected tuples
public long delete(Generator generator, TupleFilter filter) {
return table.delete(generator, filter);
}
// Delete specified tuples. If there are tuplesToDelete not found in this Relvar, and errorIfNotIncluded is true, throw an error.
public long delete(Context context, ValueRelation tuplesToDelete, boolean errorIfNotIncluded) {
return table.delete(context, tuplesToDelete, errorIfNotIncluded);
}
// Update all tuples using a given update operator
public long update(Context context, Operator updateTupleOperator) {
return table.update(context.getGenerator(), new RelTupleMap(context, updateTupleOperator));
}
// Update selected tuples using a given update operator
public long update(Context context, Operator whereTupleOperator, Operator updateTupleOperator) {
return table.update(context.getGenerator(), new RelTupleFilter(context, whereTupleOperator), new RelTupleMap(context, updateTupleOperator));
}
// Get a TupleIterator
public TupleIterator iterator(Generator generator) {
return table.iterator(generator);
}
}