Hi!

I have finally completed the "port" of my application from SA 1.4 to SA
2.0b.

TL;DR I'm writing this report to ask an opinion about possible
"improvements" to the Range class.

Given that the previous state was already "clean" (that is, executing
the test suite with SQLALCHEMY_WARN_20=1 did not raise any warning), I
did not have big surprises (a loud applause here!).

The area that required lot of changes has been the introduction of the
new Range object: as said in previous emails this application uses
DATERANGE in many entities, and TSRANGE in a couple of cases.

The common modification has been replacing

  from psycopg2.extras import DateRange

with

  from sqlalchemy.dialects.postgresql import Range

and adapting the code accordingly, say from

  validity = DateRange(now, then, '[]')

to

  validity = Range(now, then, bounds='[]'')

most of that thru regexp search and replace and Emacs keyboard macros.
Not a big deal.

Where I had to spend more thinking has been in two differences, one
minor/cosmetic, the other more substantial.

On the former one, it would be nice if we could reduce the "distance"
between the new Range class and what popular drivers provide:

- "empty" vs "isempty": both asyncpg and psycopg have a "isempty"
  property, we could either rename the "empty" attribute or add an
  property alias

- bounds inclusiveness: both drivers expose that thru
  "lower_inc"/"upper_inc" properties, while in SA we must say
  `range.bounds[0] == '['`

- infinite bounds: likewise, they both provide "lower_inf"/"upper_inf"
  properties, whereas we must say `range.lower is None and not
  range.empty`

As you see, these are "syntactic sugar" differences, easily implemented
with some @properties.

What is more substantial, that required slightly more impacting changes
in a few cases, is that the SA Range does not have an exact notion of
its "type", i.e. there is no way to determine the data type of an empty
or infinite range.

For example, my app shows the period of validity of (say) a contract,
which storage is a daterange, either in a compact form (mm/dd/yy -
mm/dd/yy) or as a more verbose, human friendly message ("from Sun, 10
March 2022 to Fri, 15 March 2022"), in multiple languages, and taking
into account "infinite" variants. This was implemented with a generic
"strftime()" function taking either a date, a datetime, a DateRange or
DateTimeRange as argument, and depending on the kind it used different
gettext() messages to translate it to a string.

To emit different messages for "endless" date ranges and "endless"
datetime ranges, I had to modify the code path leading there, to bring
over the "original" kind of the range.

>From a different perspective, we had to invent a way to distinguish the
different kind of ranges also in the recent improvements to the Range
class, to be able to determine a "discrete step" for each of them.

So I wonder if it would be reasonable/doable/affordable if SA could grow
a "family" of classes, derived from current Range, one for each data
type, so that for example a DATARANGE column would be associated with a
DateRange instance.

What do you think?

ciao, lele.
-- 
nickname: Lele Gaifax | Dire che Emacs è "conveniente" è come
real: Emanuele Gaifas | etichettare l'ossigeno come "utile"
l...@etour.tn.it      |                           -- Rens Troost

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/87pmd4lat5.fsf%40metapensiero.it.

Reply via email to