RFC: temporal data facilities of my DBMS language Muldis D

[email protected] (Darren Duncan)
Newsgroups perl.datetime
Message-ID <[email protected]>
Hello,

As some of you may know, I've been developing a new language for defining 
and interacting with relational databases called Muldis D.  One can 
conceptualize this language as a generalization of the various SQL dialects 
that should be able to natively express any data value or operation in a 
rigorously defined and portable manner.  It can stand as an intermediate 
representation when translating SQL from one DBMS' flavor to another, or an 
intermediary between a DBMS and various DBMS wrappers such as ORMs etc. 
The language has 2 defined dialects, one being plain text like a normal 
language, and the other defined in terms of Perl data structures, arrays of 
arrays etc, which is a common input or internal format for ORMs these days. 
  The language design is more or less done, in that core features and how 
to bootstrap it are defined.  I'm currently working on an implementation, 
which should be runnable soon.

Tonight I just uploaded to CPAN version 0.48.0 of the spec, which you can 
now see at http://search.cpan.org/dist/Muldis-D/ .  The reason I am writing 
you is that this version includes the first rewrite of the temporal data 
types and operators that I am satisfied with, and I'm looking for your 
feedback towards their further improvement.  I am not seeking feedback 
about the language at large (though you can say anything you want), but 
specifically about the parts dealing with dates and times.

I prefer all responses to be on-list by default (assuming a datetime focus) 
unless you have a reason to reply in private instead.

Muldis D's datetime features are mainly inspired by both the SQL spec and 
by the DateTime module, and are defined closely to both, so they should be 
able to serve as a lossless intermediary between the Perl and database 
contexts.

There are 3 classes of data types, called UTCInstant, FloatInstant, and 
Duration (all 3 having YMDHIS components); the first 2 each have DateTime, 
Date, Time subtypes.  They are all defined in terms of integers, either 
directly or indirectly by way of rationals (seconds is rational); these are 
all arbitrary precision and radix independent, and can exactly represent 
values from base 10 or base 2 or base anything else; precision goes beyond 
nanosecond if needed.  The UTC and Float instants are identical in 
structure but are disjoint types, so they are not comparable, as is 
Duration with both.  (Muldis D is strongly typed and has explicit rules for 
what can be compared for equality and ordering, and the semantics when that 
is allowed.)

My language recognizes that there is no exact or constant conversion rate 
between many units (YM<->D<->HI<->S), so it stores them separately on 
purpose for best accuracy.  The feature set also supports incomplete 
datetimes, where one can just supply those of the 6 units they know as 
defined/Single values, and can leave the rest undefined/Nothing; undefined 
is treated as distinct from zero.  This incompleteness is also exploited 
such that the DateTime|Date|Time subtypes are simply defined as Instants 
where certain attributes are defined and others not; they are pre-defined 
names for the common cases of defined YMDHIS, YMD, HIS; all subtypes of the 
same root type are mutually comparable.  Leap days and seconds are 
supported, though only in regards to UTC/floating semantics.

For the moment, I decided for simplicity and for focus on the storage 
emphasis of databases, to not natively support multiple time zones nor 
daylight savings time offsets.  For a datetime you can choose either the 
fixed UTC time zone or a floating timezone.  If you want "local time" then 
you will have to convert to/from that externally (to the Muldis D 
intermediate representation, on the Perl side or DBMS side or both).  I 
think this is reasonable if you are just following the best practice of 
using UTC for storage and local only for display.  This all said, if an 
actual timezone offset carries useful information in a database, I can add 
support later for representing that, but it would be in the form of extra 
disjoint types that aren't comparable to the existing ones.

The specific parts of the Muldis D language spec dealing with date and time 
specific stuff can be seen at these 3 urls:

   http://search.cpan.org/dist/Muldis-D/lib/Muldis/D/Ext/Temporal.pod
   http://search.cpan.org/dist/Muldis-D/lib/Muldis/D/Dialect/PTMD_Tiny.pod
http://search.cpan.org/dist/Muldis-D/lib/Muldis/D/Dialect/HDMD_Perl_Tiny.pod

The Temporal.pod url has the actual datetime specific type and routine 
definitions.  You can think of one of those typedefs as being akin to an OO 
class definition and some subclass definitions; you can read the term 
"possrep" (possible representation) as being the fundamental object 
interface definition, each one typically providing the 6 type/object 
attributes YMDHIS.  The Temporal.pod doesn't list the selector/constructor 
routines (taking attr-name/value pairs) or attribute accessor routines, or 
generic comparator or sorting etc routines, that you expect, as those are 
defined elsewhere (Routines.pod, Ordered.pod) once for all/all-ordered 
language data types.  Note that all Muldis D values are immutable, so any 
mutators actually just return new values.  All type/object attributes are 
public though they are virtual so an implementation can do whatever it 
wants behind the scenes.  Each subtype adds a second possrep, so it is like 
each type has multiple object interfaces.  Users can also define their own 
subtypes/subclasses and add their own interfaces.

The only operators currently provided do addition/subtraction; in the 
future I anticipate fleshing these out to let users specify semantics more 
such as normalization and carry-over etc to take place in the operation, 
but for now I don't to keep it simple; I also anticipate adding 
multiply/divide and overlaps etc later, though the last will probably just 
be generic for all ordered types.

A portion each of the PTMD_Tiny.pod and HDMD_Perl_Tiny.pod files show the 
special literal syntax for value literals of datetime types provided by the 
existing Muldis D dialects, where you can define values as an ordered 
number list that is compact relative to the generic named form.

Anyway, details as I have them are at the above urls.  Let me know if you 
don't understand something and I will try to clarify.

Thanks in advance for any feedback or design etc help for my own datetime 
field contributions.

-- Darren Duncan
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.