feat: add postgres multirange column types (#10627)

* feat: add postgres multirange column types

Adds int4-, int8-, num-, ts-, tstz-, date-multirange column types for postgres
Update docs to include multirange column types
Update functional column-types-postgres test to test multirange column types

Closes: #10556

* style: run npm run format

---------

Co-authored-by: Dmitry Zotov <dmzt08@gmail.com>
This commit is contained in:
Niels Stinissen 2024-01-26 07:33:16 +01:00 committed by GitHub
parent 54d8d9efe9
commit d0b76703cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 118 additions and 33 deletions

View File

@ -1,20 +1,29 @@
# Entities
- [What is Entity?](#what-is-entity)
- [Entity columns](#entity-columns)
- [Primary columns](#primary-columns)
- [Special columns](#special-columns)
- [Spatial columns](#spatial-columns)
- [Column types](#column-types)
- [Column types for `mysql` / `mariadb`](#column-types-for-mysql--mariadb)
- [Column types for `postgres` / `cockroachdb`](#column-types-for-postgres)
- [Column types for `sqlite` / `cordova` / `react-native` / `expo`](#column-types-for-sqlite--cordova--react-native--expo)
- [Column types for `mssql`](#column-types-for-mssql)
- [`enum` column type](#enum-column-type)
- [`simple-array` column type](#simple-array-column-type)
- [`simple-json` column type](#simple-json-column-type)
- [Columns with generated values](#columns-with-generated-values)
- [Column options](#column-options)
- [Entities](#entities)
- [What is Entity?](#what-is-entity)
- [Entity columns](#entity-columns)
- [Primary columns](#primary-columns)
- [Special columns](#special-columns)
- [Spatial columns](#spatial-columns)
- [Column types](#column-types)
- [Column types for `mysql` / `mariadb`](#column-types-for-mysql--mariadb)
- [Column types for `postgres`](#column-types-for-postgres)
- [Column types for `cockroachdb`](#column-types-for-cockroachdb)
- [Column types for `sqlite` / `cordova` / `react-native` / `expo`](#column-types-for-sqlite--cordova--react-native--expo)
- [Column types for `mssql`](#column-types-for-mssql)
- [Column types for `oracle`](#column-types-for-oracle)
- [Column types for `spanner`](#column-types-for-spanner)
- [`enum` column type](#enum-column-type)
- [`set` column type](#set-column-type)
- [`simple-array` column type](#simple-array-column-type)
- [`simple-json` column type](#simple-json-column-type)
- [Columns with generated values](#columns-with-generated-values)
- [Column options](#column-options)
- [Entity inheritance](#entity-inheritance)
- [Tree entities](#tree-entities)
- [Adjacency list](#adjacency-list)
- [Closure table](#closure-table)
## What is Entity?
@ -381,7 +390,8 @@ or
`date`, `time`, `time without time zone`, `time with time zone`, `interval`, `bool`, `boolean`,
`enum`, `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle`, `cidr`, `inet`, `macaddr`,
`tsvector`, `tsquery`, `uuid`, `xml`, `json`, `jsonb`, `int4range`, `int8range`, `numrange`,
`tsrange`, `tstzrange`, `daterange`, `geometry`, `geography`, `cube`, `ltree`
`tsrange`, `tstzrange`, `daterange`, `int4multirange`, `int8multirange`, `nummultirange`,
`tsmultirange`, `tstzmultirange`, `multidaterange`, `geometry`, `geography`, `cube`, `ltree`
### Column types for `cockroachdb`

View File

@ -1,21 +1,26 @@
# 实体
* [实体是什么?](#实体是什么)
* [实体列](#实体列)
* [主列](#主列)
* [特殊列](#特殊列)
* [空间列](#空间列)
* [列类型](#列类型)
* [`mysql`/`mariadb`的列类型](#`mysql`/`mariadb`的列类型)
* [`postgres`的列类型](#`postgres`的列类型)
* [`sqlite`/`cordova`/`react-native`/`expo`的列类型](#sqlite`/`cordova`/`react-native`/`expo`的列类型)
* [`mssql`的列类型](#`mssql`的列类型)
* [`oracle`的列类型](#`oracle`的列类型)
* [`enum`列类型](#`enum`列类型)
* [`simple-array`的列类型](#`simple-array`的列类型)
* [`simple-json`列类型](#`simple-json`列类型)
* [具有生成值的列](#具有生成值的列)
* [列选项](#列选项)
- [实体](#实体)
- [实体是什么?](#实体是什么)
- [实体列](#实体列)
- [主列](#主列)
- [特殊列](#特殊列)
- [空间列](#空间列)
- [列类型](#列类型)
- [`mysql`/`mariadb`的列类型](#mysqlmariadb的列类型)
- [`postgres`的列类型](#postgres的列类型)
- [`sqlite`/`cordova`/`react-native`/`expo`的列类型](#sqlitecordovareact-nativeexpo的列类型)
- [`mssql`的列类型](#mssql的列类型)
- [`oracle`的列类型](#oracle的列类型)
- [`enum` 列类型](#enum-列类型)
- [`simple-array`的列类型](#simple-array的列类型)
- [`simple-json` 列类型](#simple-json-列类型)
- [具有生成值的列](#具有生成值的列)
- [列选项](#列选项)
- [实体继承](#实体继承)
- [树实体](#树实体)
- [邻接列表](#邻接列表)
- [Closure 表](#closure-表)
## 实体是什么?
@ -271,7 +276,8 @@ TypeORM 支持所有最常用的数据库支持的列类型。
`date`, `time`, `time without time zone`, `time with time zone`, `interval`, `bool`, `boolean`,
`enum`, `point`, `line`, `lseg`, `box`, `path`, `polygon`, `circle`, `cidr`, `inet`, `macaddr`,
`tsvector`, `tsquery`, `uuid`, `xml`, `json`, `jsonb`, `int4range`, `int8range`, `numrange`,
`tsrange`, `tstzrange`, `daterange`, `geometry`, `geography`
`tsrange`, `tstzrange`, `daterange`, `int4multirange`, `int8multirange`, `nummultirange`,
`tsmultirange`, `tstzmultirange`, `multidaterange`, `geometry`, `geography`
### `sqlite`/`cordova`/`react-native`/`expo`的列类型

View File

@ -180,6 +180,12 @@ export class PostgresDriver implements Driver {
"tsrange",
"tstzrange",
"daterange",
"int4multirange",
"int8multirange",
"nummultirange",
"tsmultirange",
"tstzmultirange",
"datemultirange",
"geometry",
"geography",
"cube",

View File

@ -172,6 +172,14 @@ export type SimpleColumnType =
| "tstzrange" // postgres
| "daterange" // postgres
// multirange types
| "int4multirange" // postgres
| "int8multirange" // postgres
| "nummultirange" // postgres
| "tsmultirange" // postgres
| "tstzmultirange" // postgres
| "datemultirange" // postgres
// other types
| "enum" // mysql, postgres
| "set" // mysql

View File

@ -98,6 +98,15 @@ describe("database schema > column types > postgres", () => {
post.tstzrange =
"[2010-01-01 14:30:00+00,2010-01-01 15:30:00+00)"
post.daterange = "[2010-01-01,2010-01-05)"
post.int4multirange = "{[10,20),[25,30)}"
post.int8multirange = "{[200000,500000),[600000,700000)}"
post.nummultirange = "{(10.5,20.2),(30.5,40.2)}"
post.tsmultirange =
'{["2010-01-01 14:30:00","2010-01-01 15:30:00"),["2010-01-01 16:30:00","2010-01-01 17:30:00")}'
post.tstzmultirange =
'{["2010-01-01 14:30:00+00","2010-01-01 15:30:00+00"),["2010-01-01 16:30:00+00","2010-01-01 17:30:00+00")}'
post.datemultirange =
"{[2010-01-01,2010-01-05),[2010-01-10,2010-01-15)}"
post.xml =
"<book><title>Manual</title><chapter>...</chapter></book>"
post.array = [1, 2, 3]
@ -185,6 +194,12 @@ describe("database schema > column types > postgres", () => {
`["2010-01-01 14:30:00+00","2010-01-01 15:30:00+00")`,
)
loadedPost.daterange.should.be.eql(post.daterange)
loadedPost.int4multirange.should.be.eql(post.int4multirange)
loadedPost.int8multirange.should.be.eql(post.int8multirange)
loadedPost.nummultirange.should.be.eql(post.nummultirange)
loadedPost.tsmultirange.should.be.eql(post.tsmultirange)
loadedPost.tstzmultirange.should.be.eql(post.tstzmultirange)
loadedPost.datemultirange.should.be.eql(post.datemultirange)
loadedPost.xml.should.be.equal(post.xml)
loadedPost.array[0].should.be.equal(post.array[0])
loadedPost.array[1].should.be.equal(post.array[1])
@ -322,6 +337,24 @@ describe("database schema > column types > postgres", () => {
table!
.findColumnByName("daterange")!
.type.should.be.equal("daterange")
table!
.findColumnByName("int4multirange")!
.type.should.be.equal("int4multirange")
table!
.findColumnByName("int8multirange")!
.type.should.be.equal("int8multirange")
table!
.findColumnByName("nummultirange")!
.type.should.be.equal("nummultirange")
table!
.findColumnByName("tsmultirange")!
.type.should.be.equal("tsmultirange")
table!
.findColumnByName("tstzmultirange")!
.type.should.be.equal("tstzmultirange")
table!
.findColumnByName("datemultirange")!
.type.should.be.equal("datemultirange")
table!
.findColumnByName("array")!
.type.should.be.equal("integer")

View File

@ -234,6 +234,28 @@ export class Post {
@Column("daterange")
daterange: string
// -------------------------------------------------------------------------
// Multirange Type
// -------------------------------------------------------------------------
@Column("int4multirange")
int4multirange: string
@Column("int8multirange")
int8multirange: string
@Column("nummultirange")
nummultirange: string
@Column("tsmultirange")
tsmultirange: string
@Column("tstzmultirange")
tstzmultirange: string
@Column("datemultirange")
datemultirange: string
// -------------------------------------------------------------------------
// Array Type
// -------------------------------------------------------------------------