starting on View
authorRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 13 Jul 2022 10:16:42 +0000 (20:16 +1000)
committerRalph Ronnquist <ralph.ronnquist@gmail.com>
Wed, 13 Jul 2022 10:16:42 +0000 (20:16 +1000)
vector/Query.h
vector/QueryCallbacks.h
vector/View.c [new file with mode: 0644]
vector/View.h [new file with mode: 0644]

index f13083d6df426c4ecf72f677ae1b46ca4e14fcf8..188a1eaae1d0383373cd1b32c8209af689b2a470 100644 (file)
@@ -14,7 +14,7 @@ struct QueryCallbacks;
  * a separate \ref Querytype record similar to how \ref ItemKeyFun
  * records define valye types.
  */
-typedef struct {
+typedef struct Query {
     struct QueryCallbacks *def;
 } Query;
 
index b74550ab5277efd400bc9715dad84156d7ac98d3..ad4461b426ce36f407fd3e1a8dfd46c3d6994632 100644 (file)
@@ -2,6 +2,8 @@
 #define QueryCallbacks_H
 
 typedef struct HashVector HashVector;
+typedef struct Query Query;
+typedef struct BindingTable BindingTable;;
 
 enum NextState {
     /**
@@ -27,7 +29,7 @@ enum NextState {
  * A struct Query_callbacks record defines the callbacks for a
  * specific Query type.
  */
-struct QueryCallbacks {
+typedef struct QueryCallbacks {
     /**
      * \brief Callback function to reclaim the Query memory for a
      * given Query.
@@ -69,6 +71,6 @@ struct QueryCallbacks {
      * hashvector.
      */
     void (*variables)(Query *this,HashVector *hv);
-};
+} QueryCallbacks;
 
 #endif
diff --git a/vector/View.c b/vector/View.c
new file mode 100644 (file)
index 0000000..5da2bcc
--- /dev/null
@@ -0,0 +1,86 @@
+#include <stdlib.h>
+#include <View.h>
+#include <HashVector.h>
+#include <QueryCallbacks.h>
+#include <Query.h>
+#include <stringitem.h>
+
+/**
+ * A View is a "virtual relation" that captures the differences at
+ * successive evaluations in the binding sequences offered by a query.
+ */
+typedef struct {
+    struct QueryCallbacks *def;
+    /**
+     * This is the source query to be a view of.
+     */
+    Query *source;
+    /**
+     * This is the size of the names tuple.
+     */
+    int arity;
+    /**
+     * This is the binding names to track.
+     */
+    Tuple *names;
+    /**
+     * This is the collection of bindings for the tracked names being
+     * gained at the latest evaluation.
+     */
+    HashVector gained;
+    /**
+     * This is the collection of bindings for the tracked names being
+     * last at the latest evaluation.
+     */
+    HashVector lost;
+} View;
+
+static Tuple *View_type_Tuple(HashVector *hv) {
+    Tuple *t = Tuple_calloc( hv->fill );
+    VectorIndex index = 0;
+    for ( ; index < hv->table.size; index++ ) {
+       t->elements[ index ] = &stringitem;
+    }
+    return t;
+}
+
+static QueryCallbacks View_def = {
+    .reclaim = 0,
+    .next = 0,
+    .variables = 0
+};
+
+Query *View_create(Query *q) {
+    View *vq = (View*) malloc( sizeof( View ) );
+    HashVector hv = (HashVector) {
+       .table = (Vector) {
+           .variant = Nibble_index_levels, .size = 16, .entries = 0
+       },
+       .fill = 0, .holes = 0, .type = &stringitem
+    };
+    q->def->variables( q, &hv ); // Obtain query variables
+    
+    TupleSchema *ts = TupleSchema_create( hv.fill, View_type_Tuple( &hv ) );
+    (*vq) = (View) {
+       .def = &View_def,
+       .source = q,
+       .arity = 0,
+       .gained = (HashVector) {
+           .table = (Vector) {
+               .variant = Nibble_index_levels,
+               .size = 16,
+               .entries = 0
+           },
+           .fill = 0, .holes = 0, .type = (ItemKeyFun*) ts
+       },
+       .lost = (HashVector) {
+           .table = (Vector) {
+               .variant = Nibble_index_levels,
+               .size = 16,
+               .entries = 0
+           },
+           .fill = 0, .holes = 0, .type = (ItemKeyFun*) ts
+       }
+    };
+    return (Query*) vq;
+}
diff --git a/vector/View.h b/vector/View.h
new file mode 100644 (file)
index 0000000..92e38e4
--- /dev/null
@@ -0,0 +1,5 @@
+#ifndef View_H
+#define View_H
+
+
+#endif