basic record definitions moved from storage/tracking to shape

This commit is contained in:
Helmut Merz 2024-07-25 16:28:02 +02:00
parent e8730daf79
commit b6f09c8f04
3 changed files with 32 additions and 32 deletions

View file

@ -2,10 +2,19 @@
(defpackage :scopes/shape (defpackage :scopes/shape
(:use :common-lisp) (:use :common-lisp)
(:export #:record)) (:export #:record #:head-fields #:head #:data
#:head-plist))
(in-package :scopes/shape) (in-package :scopes/shape)
(defclass record () (defclass record ()
((head :accessor head :initarg :head) ((head-fields :reader head-fields :initarg :head-fields :initform '(:taskid :username))
(head :accessor head :initarg :head)
(data :accessor data :initform nil))) (data :accessor data :initform nil)))
(defun head-plist (track)
(let (pl (hv (head track)))
(dolist (hf (head-fields track))
(setf (getf pl hf) (if (car hv) (car hv) ""))
(setf hv (cdr hv)))
pl))

View file

@ -4,9 +4,10 @@
(defpackage :scopes/storage/tracking (defpackage :scopes/storage/tracking
(:use :common-lisp) (:use :common-lisp)
(:local-nicknames (:jzon :com.inuoe.jzon) (:local-nicknames (:shape :scopes/shape)
(:storage :scopes/storage)) (:storage :scopes/storage)
(:export #:track #:trackid #:head #:head-plist #:time-stamp #:data (:jzon :com.inuoe.jzon))
(:export #:track #:trackid #:time-stamp
#:container #:insert #:container #:insert
#:make-item #:make-item
#:get-track #:get-track
@ -14,12 +15,9 @@
(in-package :scopes/storage/tracking) (in-package :scopes/storage/tracking)
(defclass track () (defclass track (shape:record)
((head-fields :reader head-fields :initarg :head-fields :initform '(:taskid :username)) ((trackid :accessor trackid :initform nil)
(trackid :accessor trackid :initform nil)
(head :accessor head :initarg :head)
(time-stamp :accessor time-stamp :initform nil) (time-stamp :accessor time-stamp :initform nil)
(data :accessor data :initform nil)
(container :reader container :initarg :container))) (container :reader container :initarg :container)))
(defun timestamp-to-sql (tr ts) (defun timestamp-to-sql (tr ts)
@ -31,26 +29,19 @@
(indexes :reader indexes :initform '((taskid username) (username))) (indexes :reader indexes :initform '((taskid username) (username)))
(storage :reader storage :initarg :storage))) (storage :reader storage :initarg :storage)))
(defmethod head-fields ((cont container)) (defmethod shape:head-fields ((cont container))
(head-fields (make-instance (item-class cont)))) (shape:head-fields (make-instance (item-class cont))))
(defun make-item (cont &rest head) (defun make-item (cont &rest head)
(make-instance (item-class cont) :head head :container cont)) (make-instance (item-class cont) :head head :container cont))
(defun head-plist (track)
(let (pl (hv (head track)))
(dolist (hf (head-fields track))
(setf (getf pl hf) (if (car hv) (car hv) ""))
(setf hv (cdr hv)))
pl))
(defun ensure-timestamp (track) (defun ensure-timestamp (track)
(if (not (time-stamp track)) (if (not (time-stamp track))
(setf (time-stamp track) (get-universal-time)))) (setf (time-stamp track) (get-universal-time))))
(defun plist (track) (defun plist (track)
(let ((vl (head-plist track))) (let ((vl (shape:head-plist track)))
(with-slots ((trid trackid) (ts time-stamp) data) track (with-slots ((trid trackid) (ts time-stamp) (data shape:data)) track
(if trid (setf (getf vl :trackid) trid)) (if trid (setf (getf vl :trackid) trid))
(if ts (setf (getf vl :timestamp) (timestamp-to-sql track ts))) (if ts (setf (getf vl :timestamp) (timestamp-to-sql track ts)))
(if data (setf (getf vl :data) (jzon:stringify data)))) (if data (setf (getf vl :data) (jzon:stringify data))))
@ -71,7 +62,7 @@
(defun get-track (cont trid) (defun get-track (cont trid)
(let* ((st (storage cont)) (let* ((st (storage cont))
(table (storage:qualified-table-name st (table-name cont))) (table (storage:qualified-table-name st (table-name cont)))
(cols (append (head-fields cont) '(:timestamp :data))) (cols (append (shape:head-fields cont) '(:timestamp :data)))
(row (storage:normalize-plist (car (storage:query st (row (storage:normalize-plist (car (storage:query st
(sxql:select cols (sxql:select cols
(sxql:from table) (sxql:from table)
@ -79,11 +70,11 @@
(build-track cont row))) (build-track cont row)))
(defun build-track (cont row) (defun build-track (cont row)
(let* ((hv (mapcar #'(lambda (x) (getf row x)) (head-fields cont))) (let* ((hv (mapcar #'(lambda (x) (getf row x)) (shape:head-fields cont)))
(tr (apply #'make-item cont hv))) (tr (apply #'make-item cont hv)))
(setf (trackid tr) (getf row :trackid)) (setf (trackid tr) (getf row :trackid))
(setf (time-stamp tr) (getf row :timestamp)) (setf (time-stamp tr) (getf row :timestamp))
(setf (data tr) (setf (shape:data tr)
(jzon:parse (getf row :data) :key-fn #'storage:normalize-keyword)) (jzon:parse (getf row :data) :key-fn #'storage:normalize-keyword))
tr)) tr))
@ -92,7 +83,7 @@
((st (storage cont)) ((st (storage cont))
(tn (table-name cont)) (tn (table-name cont))
(table (storage:qualified-table-name st tn)) (table (storage:qualified-table-name st tn))
(head-fields (head-fields cont)) (head-fields (shape:head-fields cont))
(params (storage:params st)) (params (storage:params st))
(id-type (getf params :id-type)) (id-type (getf params :id-type))
(json-type (getf params :json-type)) (json-type (getf params :json-type))

View file

@ -7,6 +7,7 @@
(:local-nicknames (:config :scopes/config) (:local-nicknames (:config :scopes/config)
(:core :scopes/core) (:core :scopes/core)
(:logging :scopes/logging) (:logging :scopes/logging)
(:shape :scopes/shape)
(:storage :scopes/storage) (:storage :scopes/storage)
(:tracking :scopes/storage/tracking) (:tracking :scopes/storage/tracking)
(:t :scopes/testing)) (:t :scopes/testing))
@ -40,18 +41,17 @@
(data (make-hash-table)) (data (make-hash-table))
cont tr tr2) cont tr tr2)
(setf cont (make-instance 'tracking:container :storage st)) (setf cont (make-instance 'tracking:container :storage st))
(defparameter cl-user::*cont cont)
(storage:drop-table st :tracks) (storage:drop-table st :tracks)
(tracking:create-table cont) (tracking:create-table cont)
(setf tr (tracking:make-item cont "t01" "john")) (setf tr (tracking:make-item cont "t01" "john"))
(== (tracking:head tr) '("t01" "john")) (== (shape:head tr) '("t01" "john"))
(== (tracking:head-plist tr) '(:username "john" :taskid "t01")) (== (shape:head-plist tr) '(:username "john" :taskid "t01"))
(== (tracking:data tr) nil) (== (shape:data tr) nil)
(setf (gethash :desc data) "scopes/storage: queries") (setf (gethash :desc data) "scopes/storage: queries")
(setf (tracking:data tr) data) (setf (shape:data tr) data)
(tracking:insert tr) (tracking:insert tr)
(== (tracking:trackid tr) 1) (== (tracking:trackid tr) 1)
(setf tr2 (tracking:get-track cont 1)) (setf tr2 (tracking:get-track cont 1))
(== (tracking:head tr2) '("t01" "john")) (== (shape:head tr2) '("t01" "john"))
(== (gethash :desc (tracking:data tr2)) "scopes/storage: queries") (== (gethash :desc (shape:data tr2)) "scopes/storage: queries")
)) ))