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