#include <tupleitem.h>
/**
- * A relation is an implementation of a tuple set with a primary key
- * through a hashvector whose "type" defines the key. Additional
- * hashvectors may be added to impose additional key restrictions and
- * the final relation is the intersection of them all.
- *
- * The relation record itself holds the column schema whereas the
- * indexes hold key schemas that in practice are copies of the column
- * schema with some columns blanked out.
+ * A relation is an implementation of a tuple set with (optional) key
+ * constraints. The store is a hashvector whose "type" is a
+ * tupleschema that defines the columns. The key constraints are
+ * represented as additional hashvectors whose tupleschemas are clones
+ * of the column schema with some columns excluded.
+ * \extends hashvector
*/
typedef struct {
- vector indexes; // one or more indexes over the tuple collection
- tupleschema *columns;
+ /**
+ * This is the primary content store for the relation. Its type
+ * should be a tupleschema declaring the "item types" for the
+ * relation columns.
+ */
+ hashvector content;
+
+ /**
+ * This is a collection of relational constraints, if any, which
+ * are represented as hashvectors whose tupleschemas are clones of
+ * the content tupleschema with some columns excluded.
+ */
+ vector constraints;
} relation;
/**
- * Create a relation of the given arity and tupleschema.
+ * Create a relation for the given tupleschema.
*/
-extern relation *relation_create(int arity,tupleschema *schema);
+extern relation *relation_create(tupleschema *schema);
/**
* Add a a key index to the relation by identifying the value part for
/**
- * Add a tuple to a relation.
+ * \brief Add a tuple to a relation.
+ * \param r is th relation concerned.
+ * \param t is the tuple to add.
+ *
* \returns a vector of all knocked out tuples.
*/
extern vector *relation_add(relation *r,tuple *t);
+/**
+ * \brief Delete all tuples matching to the query.
+ * \returns all deleted tuples.
+ */
+extern vector *relation_delete(relation *r,tuple *query);
+
+/**
+ * \brief Return next tuple matching the query at or after the index.
+ * \returns any such matching tuple and updates *index to its index.
+ */
+extern void *relation_next(relation *r,vector_index *index,tuple *query);
+
#endif