[elephant-cvs] CVS elephant/examples
ieslick
ieslick at common-lisp.net
Sun Feb 19 04:52:58 UTC 2006
Update of /project/elephant/cvsroot/elephant/examples
In directory common-lisp:/tmp/cvs-serv7130/examples
Added Files:
index-tutorial.lisp sql-tutorial.lisp
Log Message:
See elephant-devel mail for changes...and take a big, deep breath...
--- /project/elephant/cvsroot/elephant/examples/index-tutorial.lisp 2006/02/19 04:52:58 NONE
+++ /project/elephant/cvsroot/elephant/examples/index-tutorial.lisp 2006/02/19 04:52:58 1.1
(defpackage elephant-tutorial
(:use :cl :elephant))
(in-package :elephant-tutorial)
(defclass simple-plog ()
((timestamp :accessor plog-timestamp :initarg :timestamp :index t)
(type :accessor plog-type :initarg :type :index t)
(data :accessor plog-data :initarg :data)
(user :accessor plog-user :initarg :user :index t))
(:metaclass persistent-metaclass)
(:documentation "Simple persistent log"))
(defclass url-record ()
((url :accessor url-record-url :initarg :url :initform "")
(fetched :accessor url-record-fetched :initarg :fetched :initform nil)
(analyzed :accessor url-record-analyzed :initarg :analyzed :initform nil))
(:documentation "An application object, declared persistent but not indexed"))
(defmethod print-object ((obj url-record) stream)
"Pretty print program objects so they're easy to inspect"
(format stream "<url: ~A ~A ~A>" (url-record-url obj) (url-record-fetched obj) (url-record-analyzed obj)))
(defclass url-log (simple-plog) ()
(:metaclass persistent-metaclass)
(:documentation "This class tracks events that transform our program object state"))
(defmethod print-object ((obj url-log) stream)
"Structured printing of log entries so they're easy to inspect at the repl"
(format stream "#plog[~A :: ~A]" (plog-type obj) (plog-data obj)))
(defun log-event (user type data)
"A helper function to generically log various events by user"
(make-instance 'url-log
:timestamp (get-universal-time)
:type type
:data data
:user user))
(defun report-events-by-time (user start end)
"A custom reporting function for our logs - pull out a time range. A real
implementation might do it by dates or by dates + times using one of the
lisp time libraries"
(let ((entries1 (get-instances-by-range 'url-log 'timestamp start end))
(entries2 (get-instances-by-value 'url-log 'user user)))
(format t "Event logs for ~A (~A range, ~A user):~%" user (length entries1) (length entries2))
(format t "~{~A~%~}" (nreverse (intersection entries1 entries2)))))
;;
;; This code is the skeleton of a program
;;
(defvar *start-timestamp* nil)
(defvar *end-timestamp* nil)
(defun generate-events (user count &optional delay)
(setf *start-timestamp* (get-universal-time))
(loop for i from 1 upto count do
(let ((url (get-a-url user i)))
(sleep delay)
(fetch-url url user)
(sleep delay)
(analyze-url url user)
(sleep delay)))
(setf *end-timestamp* (get-universal-time)))
(defun get-a-url (user seq)
(let ((url (make-instance 'url-record :url (format nil "http://www.common-lisp.net/~A/" seq))))
(log-event user :received-url url)
url))
(defun fetch-url (url user)
(setf (url-record-fetched url) t)
(log-event user :fetched-url url))
(defun analyze-url (url user)
(setf (url-record-analyzed url) t)
(log-event user :analyzed-url url))
;; Top Level Test Code
(defun test-generate-and-report (name store-spec)
(open-store store-spec)
(generate-events name 10 0.2)
(report-events name)
(close-store))
(defun report-events (name)
(let ((first-third-start *start-timestamp*)
(first-third-end (+ *start-timestamp*
(/ (- *end-timestamp* *start-timestamp*) 3))))
(report-events-by-time name first-third-start first-third-end)))
--- /project/elephant/cvsroot/elephant/examples/sql-tutorial.lisp 2006/02/19 04:52:58 NONE
+++ /project/elephant/cvsroot/elephant/examples/sql-tutorial.lisp 2006/02/19 04:52:58 1.1
;;; sql-tutorial.lisp
;;;
;;; part of
;;;
;;; Elephant: an object-oriented database for Common Lisp
;;;
;;;
;;; Elephant users are granted the rights to distribute and use this software
;;; as governed by the terms of the Lisp Lesser GNU Public License
;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
(asdf:operate 'asdf:load-op :elephant)
(asdf:operate 'asdf:load-op :ele-bdb)
(asdf:operate 'asdf:load-op :elephant-tests)
(in-package "ELEPHANT-TESTS")
(open-store *testdb-path*)
(add-to-root "my key" "my value")
(get-from-root "my key")
(setq foo (cons nil nil))
(add-to-root "my key" foo)
(add-to-root "my other key" foo)
(eq (get-from-root "my key")
(get-from-root "my other key"))
(setf (car foo) T)
(get-from-root "my key")
(defclass my-persistent-class ()
((slot1 :accessor slot1)
(slot2 :accessor slot2))
(:metaclass persistent-metaclass))
(setq foo (make-instance 'my-persistent-class))
(add-to-root "foo" foo)
(add-to-root "bar" foo)
(eq (get-from-root "foo")
(get-from-root "bar"))
(get-from-root "foo")
(setf (slot1 foo) "one")
(setf (slot2 foo) "two")
(slot1 foo)
(slot2 foo)
(setf (slot1 foo) "three")
(slot1 (get-from-root "bar"))
(setq *auto-commit* nil)
(with-transaction ()
(setf (slot1 foo) 123456789101112)
(setf (slot2 foo) "onetwothree..."))
(defvar *friends-birthdays* (make-btree))
(add-to-root "friends-birthdays" *friends-birthdays*)
(setf (get-value "Andrew" *friends-birthdays*)
(encode-universal-time 0 0 0 22 12 1976))
(setf (get-value "Ben" *friends-birthdays*)
(encode-universal-time 0 0 0 14 4 1976))
(get-value "Andrew" *friends-birthdays*)
(decode-universal-time *)
(defvar curs (make-cursor *friends-birthdays*))
(cursor-close curs)
(setq curs (make-cursor *friends-birthdays*))
(cursor-current curs)
(cursor-first curs)
(cursor-next curs)
(cursor-next curs)
(cursor-close curs)
(with-transaction ()
(with-btree-cursor (curs *friends-birthdays*)
(loop
(multiple-value-bind (more k v) (cursor-next curs)
(unless more (return nil))
(format t "~A ~A~%" k v)))))
(defclass appointment ()
((date :accessor ap-date :initarg :date :type integer)
(type :accessor ap-type :initarg :type :type string))
(:metaclass persistent-metaclass))
(defvar *appointments* (with-transaction () (make-indexed-btree *store-controller*)))
(defun add-appointment (date type)
(with-transaction ()
(setf (get-value date *appointments*)
(make-instance 'appointment :date date :type type))))
(add-appointment (encode-universal-time 0 0 0 22 12 2004) "Birthday")
(add-appointment (encode-universal-time 0 0 0 14 4 2005) "Birthday")
(add-appointment (encode-universal-time 0 0 0 1 1 2005) "Holiday")
(defun key-by-type (secondary-db primary value)
(declare (ignore secondary-db primary))
(let ((type (ap-type value)))
(when type
(values t type))))
(with-transaction ()
(add-index *appointments* :index-name 'by-type
:key-form 'key-by-type
:populate t))
(defvar *by-type* (get-index *appointments* 'by-type))
(decode-universal-time (ap-date (get-value "Holiday" *by-type*)))
(with-btree-cursor (curs *by-type*)
(loop for (more? k v) =
(multiple-value-list (cursor-set curs "Birthday"))
then (multiple-value-list (cursor-next-dup curs))
do
(unless more? (return t))
(multiple-value-bind (s m h d mo y)
(decode-universal-time (ap-date v))
(declare (ignore s m h))
(format t "~A/~A/~A~%" mo d y))))
More information about the Elephant-cvs
mailing list