Skip to content

Commit d138058

Browse files
committed
simplify configuration
1 parent 8e6112c commit d138058

File tree

5 files changed

+16
-37
lines changed

5 files changed

+16
-37
lines changed

API.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Path: `/collections/{cid}/items`
7676
Multiple property filters are ANDed together.
7777
* `filter=cql-expr` - filters features via a CQL expression
7878
* `filter-crs=SRID` - specifies the CRS for geometry values in the CQL filter
79-
* `datetime=INSTANT | INTERVAL` - specify a time range to filter the data by (must have a datetime column configured. see [Temporal](config/pg_featureserv.toml.example) section of config)
79+
* `datetime=INSTANT | INTERVAL` - specify a time range to filter the data by (must have a datetime column configured. see [Database](config/pg_featureserv.toml.example) section of config)
8080
* exact match: `datetime=2025-01-02T00:00:00Z`
8181
* between: `datetime=2025-01-02T00:00:00Z/2025-02-02T00:00:00Z`
8282
* before: `datetime=../2025-01-02T00:00:00Z`

config/pg_featureserv.toml.example

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,13 @@ WriteTimeoutSec = 30
6868
# Publish functions from these schemas (default is publish postgisftw)
6969
# FunctionIncludes = [ "postgisftw", "schema2" ]
7070

71-
72-
[Temporal]
7371
# Assign time columns for tables with temporal data
7472
# These should be timestamp or timestamptz columns in the table
7573
# Columns to be used for feature start and end of time intervals
76-
StartColumns = [ "start_time" ]
77-
EndColumns = [ "end_time" ]
78-
74+
StartTimeColumns = [ "start_time" ]
75+
EndTimeColumns = [ "end_time" ]
7976
# Columns to be used for (instantaneous) feature timestamps
80-
InstantColumns = [ "time" ]
77+
TimeColumns = [ "time" ]
8178

8279
[Paging]
8380
# The default number of features in a response

internal/conf/config.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ func setDefaultConfig() {
4444
viper.SetDefault("Database.TableIncludes", []string{})
4545
viper.SetDefault("Database.TableExcludes", []string{})
4646
viper.SetDefault("Database.FunctionIncludes", []string{"postgisftw"})
47-
48-
viper.SetDefault("Temporal.InstantColumns", []string{"time"})
49-
viper.SetDefault("Temporal.StartColumns", []string{"start_time"})
50-
viper.SetDefault("Temporal.EndColumns", []string{"end_time"})
47+
viper.SetDefault("Database.TimeColumns", []string{"time"})
48+
viper.SetDefault("Database.StartTimeColumns", []string{"start_time"})
49+
viper.SetDefault("Database.EndTimeColumns", []string{"end_time"})
5150

5251
viper.SetDefault("Paging.LimitDefault", 10)
5352
viper.SetDefault("Paging.LimitMax", 1000)
@@ -65,7 +64,6 @@ type Config struct {
6564
Metadata Metadata
6665
Database Database
6766
Website Website
68-
Temporal Temporal
6967
}
7068

7169
// Server config
@@ -99,6 +97,9 @@ type Database struct {
9997
TableIncludes []string
10098
TableExcludes []string
10199
FunctionIncludes []string
100+
TimeColumns []string
101+
StartTimeColumns []string
102+
EndTimeColumns []string
102103
}
103104

104105
// Metadata config
@@ -111,12 +112,6 @@ type Website struct {
111112
BasemapUrl string
112113
}
113114

114-
type Temporal struct {
115-
InstantColumns []string
116-
StartColumns []string
117-
EndColumns []string
118-
}
119-
120115
// IsHTTPSEnabled tests whether HTTPS is enabled
121116
func (conf *Config) IsTLSEnabled() bool {
122117
return conf.Server.TlsServerCertificateFile != "" && conf.Server.TlsServerPrivateKeyFile != ""
@@ -191,7 +186,7 @@ func DumpConfig() {
191186
log.Debugf(" TableExcludes = %v", Configuration.Database.TableExcludes)
192187
log.Debugf(" FunctionIncludes = %v", Configuration.Database.FunctionIncludes)
193188
log.Debugf(" TransformFunctions = %v", Configuration.Server.TransformFunctions)
194-
log.Debugf(" Temporal.InstantColumns = %v", Configuration.Temporal.InstantColumns)
195-
log.Debugf(" Temporal.StartColumns = %v", Configuration.Temporal.StartColumns)
196-
log.Debugf(" Temporal.EndColumns = %v", Configuration.Temporal.EndColumns)
189+
log.Debugf(" TimeColumns = %v", Configuration.Database.TimeColumns)
190+
log.Debugf(" StartTimeColumns = %v", Configuration.Database.StartTimeColumns)
191+
log.Debugf(" EndTimeColumns = %v", Configuration.Database.EndTimeColumns)
197192
}

internal/data/catalog_db.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,9 +742,9 @@ func temporalColumns(names []string, types map[string]string) (string, string) {
742742
return ""
743743
}
744744
// QUESTION: preference of time columns? instant vs start/end?
745-
instant := lookup(conf.Configuration.Temporal.InstantColumns)
746-
start := lookup(conf.Configuration.Temporal.StartColumns)
747-
end := lookup(conf.Configuration.Temporal.EndColumns)
745+
instant := lookup(conf.Configuration.Database.TimeColumns)
746+
start := lookup(conf.Configuration.Database.StartTimeColumns)
747+
end := lookup(conf.Configuration.Database.EndTimeColumns)
748748
if instant != "" && (start == "" || end == "") {
749749
start = instant
750750
end = instant

internal/service/param_datetime_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,9 @@ package service
33
import (
44
"testing"
55
"time"
6-
7-
"github.com/CrunchyData/pg_featureserv/internal/conf"
86
)
97

10-
func setTemporalConfig() {
11-
conf.Configuration.Temporal.InstantColumns = []string{"observed_at"}
12-
conf.Configuration.Temporal.StartColumns = []string{"start_time"}
13-
conf.Configuration.Temporal.EndColumns = []string{"end_time"}
14-
}
15-
168
func TestParseDateTimeRangeInstant(t *testing.T) {
17-
setTemporalConfig()
189
rng, err := parseDateTimeRange("2018-02-12T23:20:52Z")
1910
if err != nil {
2011
t.Fatalf("unexpected error: %v", err)
@@ -34,7 +25,6 @@ func TestParseDateTimeRangeInstant(t *testing.T) {
3425
}
3526

3627
func TestParseDateTimeRangeDate(t *testing.T) {
37-
setTemporalConfig()
3828
rng, err := parseDateTimeRange("2018-02-12")
3929
if err != nil {
4030
t.Fatalf("unexpected error: %v", err)
@@ -59,7 +49,6 @@ func TestParseDateTimeRangeDate(t *testing.T) {
5949
}
6050

6151
func TestParseDateTimeRangeInterval(t *testing.T) {
62-
setTemporalConfig()
6352
rng, err := parseDateTimeRange("2018-02-12T00:00:00Z/2018-03-18T12:31:12Z")
6453
if err != nil {
6554
t.Fatalf("unexpected error: %v", err)
@@ -73,7 +62,6 @@ func TestParseDateTimeRangeInterval(t *testing.T) {
7362
}
7463

7564
func TestParseDateTimeRangeOpen(t *testing.T) {
76-
setTemporalConfig()
7765
rng, err := parseDateTimeRange("../2018-03-18T12:31:12Z")
7866
if err != nil {
7967
t.Fatalf("unexpected error: %v", err)
@@ -90,7 +78,6 @@ func TestParseDateTimeRangeOpen(t *testing.T) {
9078
}
9179

9280
func TestParseDateTimeRangeInvalid(t *testing.T) {
93-
setTemporalConfig()
9481
if _, err := parseDateTimeRange("not-a-date"); err == nil {
9582
t.Fatalf("expected error for invalid input")
9683
}

0 commit comments

Comments
 (0)