changelog shortlog graph tags branches changeset file revisions annotate raw help

Mercurial > core / lisp/lib/obj/query.lisp

revision 524: a873b5bbaebe
parent 515: c2d33f5bc5cb
child 525: d9bab6705bd5
     1.1--- a/lisp/lib/obj/query.lisp	Sun Jul 07 20:10:49 2024 -0400
     1.2+++ b/lisp/lib/obj/query.lisp	Sun Jul 07 22:58:35 2024 -0400
     1.3@@ -25,7 +25,6 @@
     1.4 
     1.5 (defvar *literal-value-types* '(boolean fixnum signed-byte unsigned-byte float double-float string))
     1.6 (deftype literal-value-type () `(or ,@*literal-value-types*))
     1.7-(deftype literal-value-vector () '(vector literal-value-type))
     1.8 
     1.9 (defstruct field
    1.10   (name (symbol-name (gensym "#")) :type simple-string)
    1.11@@ -56,23 +55,45 @@
    1.12   (declare (ignore env))
    1.13   `(make-instance ,(class-of self) :metadata ,(schema-metadata self)))
    1.14 
    1.15+;; convenience interface for FIELD-VECTOR
    1.16+(defclass column-vector () ((data :type simple-vector :accessor column-data)))
    1.17+
    1.18+(defclass literal-value-vector ()
    1.19+  ((type :type literal-value-type :initarg :type)
    1.20+   (value :initarg :value :accessor column-type :accessor column-literal-value)
    1.21+   (size :type fixnum :initarg :size :accessor column-size)))
    1.22+   
    1.23+(defgeneric column-type (self)
    1.24+  (:method ((self column-vector))
    1.25+    (array-element-type (column-data self))))
    1.26+
    1.27+(defgeneric column-value (self i)
    1.28+  (:method ((self column-vector) (i fixnum))
    1.29+    (aref (column-data self) i))
    1.30+  (:method ((self literal-value-vector) (i fixnum))
    1.31+    (if (or (< i 0) (>= i (column-size self)))
    1.32+        (error 'simple-error :format-control "index out of bounds: ~A" :format-arguments i)
    1.33+        (column-literal-value self))))
    1.34+
    1.35+(defgeneric column-size (self)
    1.36+  (:method ((self column-vector))
    1.37+    (length (column-data self))))
    1.38+
    1.39 (defstruct record-batch
    1.40   (schema (make-schema) :type schema)
    1.41   (fields #() :type field-vector))
    1.42 
    1.43-(defclass data-source ()
    1.44-  ((schema :type schema)))
    1.45-
    1.46 (defmethod make-load-form ((self record-batch) &optional env)
    1.47   (declare (ignore env))
    1.48   `(make-record-batch :schema ,(record-batch-schema self) :fields ,(record-batch-fields self)))
    1.49 
    1.50 (defgeneric field (self n)
    1.51   (:method ((self record-batch) (n fixnum))
    1.52-    (svref (record-batch-fields self) n)))
    1.53+    (aref (record-batch-fields self) n)))
    1.54 
    1.55-(defmethod fields ((self record-batch))
    1.56-  (record-batch-fields self))
    1.57+(defgeneric fields (self)
    1.58+  (:method ((self record-batch))
    1.59+    (record-batch-fields self)))
    1.60 
    1.61 (defgeneric schema (self)
    1.62   (:method ((self record-batch))
    1.63@@ -82,13 +103,17 @@
    1.64 
    1.65 (defgeneric row-count (self)
    1.66   (:method ((self record-batch))
    1.67-    (sequence:length (svref (record-batch-fields self) 0))))
    1.68+    (sequence:length (aref (record-batch-fields self) 0))))
    1.69 
    1.70 (defgeneric column-count (self)
    1.71   (:method ((self record-batch))
    1.72     (length (record-batch-fields self))))
    1.73 
    1.74-(defgeneric scan-data (self &optional projection)
    1.75+;;; Data Source
    1.76+(defclass data-source ()
    1.77+  ((schema :type schema :accessor schema)))
    1.78+
    1.79+(defgeneric scan-data-source (self projection)
    1.80   (:documentation "Scan the data source, selecting the specified columns."))
    1.81 
    1.82 ;;; Data Frame