package org.reldb.rel.v0.storage.catalog;
import org.reldb.rel.exceptions.ExceptionSemantic;
import org.reldb.rel.v0.generator.Generator;
import org.reldb.rel.v0.generator.OperatorSignature;
import org.reldb.rel.v0.storage.*;
import org.reldb.rel.v0.storage.relvars.RelvarRealMetadata;
import org.reldb.rel.v0.values.*;
public class RelvarOperators extends RelvarSystem {
public RelvarOperators(String name, RelDatabase database, RelvarRealMetadata metadata) {
super(name, database, metadata);
}
private ValueTuple getTupleFor(Generator generator, String signature, String returnsType, String definition, String language, String generatedByType, String owner) {
Value[] rawTuple = new Value[] {
ValueCharacter.select(generator, signature),
ValueCharacter.select(generator, returnsType),
ValueCharacter.select(generator, definition),
ValueCharacter.select(generator, language),
ValueCharacter.select(generator, generatedByType),
ValueCharacter.select(generator, owner),
ValueInteger.select(generator, getDatabase().getUniqueID())
};
return new ValueTuple(generator, rawTuple);
}
private ValueTuple getTupleFor(Generator generator, String name, ValueRelationLiteral implementation) {
Value[] rawTuple = new Value[] {
ValueCharacter.select(generator, name),
implementation // implementations - attribute 2
};
return new ValueTuple(generator, rawTuple);
}
protected ValueTuple getKeyTuple(Generator generator, String name) {
return getTupleFor(generator, name, null);
}
public void insertInternal(Generator generator, String name, String returnsType, String signature, String definition, String language, String generatedByType, String owner) {
ValueTuple operatorTuple = getTupleForKey(generator, name);
if (operatorTuple == null) {
ValueRelationLiteral newImplementation = new ValueRelationLiteral(generator);
newImplementation.insert(getTupleFor(generator, signature, returnsType, definition, language, generatedByType, owner));
insertInternal(generator, getTupleFor(generator, name, newImplementation));
} else {
ValueRelationLiteral existingImplementations = (ValueRelationLiteral)operatorTuple.getValues()[1];
TupleIterator implementationIterator = existingImplementations.iterator();
try {
while (implementationIterator.hasNext()) {
ValueTuple implementationTuple = implementationIterator.next();
String existingImplementationSignature = ((ValueCharacter)implementationTuple.getValues()[0]).stringValue();
if (existingImplementationSignature.equalsIgnoreCase(signature))
throw new ExceptionSemantic("RS0199: OPERATOR " + signature + " already exists.");
}
} finally {
implementationIterator.close();
}
existingImplementations.insert(getTupleFor(generator, signature, returnsType, definition, language, generatedByType, owner));
deleteInternal(generator, name);
insertInternal(generator, getTupleFor(generator, name, existingImplementations));
}
}
public void deleteInternal(Generator generator, OperatorSignature signature) {
String name = signature.getName();
ValueTuple operatorTuple = getTupleForKey(generator, name);
if (operatorTuple == null) {
throw new ExceptionSemantic("RS0200: OPERATOR " + signature + " could not be found.");
} else {
ValueRelationLiteral existingImplementations = (ValueRelationLiteral)operatorTuple.getValues()[1];
TupleIterator implementationIterator = existingImplementations.iterator();
try {
while (implementationIterator.hasNext()) {
ValueTuple implementationTuple = implementationIterator.next();
String existingImplementationSignature = ((ValueCharacter)implementationTuple.getValues()[0]).stringValue();
if (existingImplementationSignature.equalsIgnoreCase(signature.toRelLookupString())) {
existingImplementations.remove(implementationTuple);
deleteInternal(generator, name);
if (existingImplementations.getCardinality() > 0)
insertInternal(generator, getTupleFor(generator, name, existingImplementations));
return;
}
}
} finally {
implementationIterator.close();
}
throw new ExceptionSemantic("RS0201: OPERATOR " + signature + " could not be found.");
}
}
/** Get the name of the type that generated this operator. Empty if not generated by a type, null if operator not found. */
public String getOperatorGenerationTypeName(Generator generator, OperatorSignature signature) {
ValueTuple operatorTuple = getTupleForKey(generator, signature.getName());
if (operatorTuple == null)
return null;
ValueRelationLiteral existingImplementations = (ValueRelationLiteral)operatorTuple.getValues()[1];
TupleIterator implementationIterator = existingImplementations.iterator();
try {
while (implementationIterator.hasNext()) {
ValueTuple implementationTuple = implementationIterator.next();
String existingImplementationSignature = ((ValueCharacter)implementationTuple.getValues()[0]).stringValue();
if (existingImplementationSignature.equalsIgnoreCase(signature.toRelLookupString()))
return ((ValueCharacter)implementationTuple.getValues()[4]).stringValue();
}
} finally {
implementationIterator.close();
}
return null;
}
/** Return true if operator exists. */
public boolean isOperatorExists(Generator generator, OperatorSignature signature) {
ValueTuple operatorTuple = getTupleForKey(generator, signature.getName());
if (operatorTuple == null)
return false;
ValueRelationLiteral existingImplementations = (ValueRelationLiteral)operatorTuple.getValues()[1];
TupleIterator implementationIterator = existingImplementations.iterator();
try {
while (implementationIterator.hasNext()) {
ValueTuple implementationTuple = implementationIterator.next();
String existingImplementationSignature = ((ValueCharacter)implementationTuple.getValues()[0]).stringValue();
if (existingImplementationSignature.equalsIgnoreCase(signature.toRelLookupString()))
return true;
}
} finally {
implementationIterator.close();
}
return false;
}
}