Skip to content

Commit 32efd42

Browse files
authored
patch - support for search queries on top of flattened postgres table… (#223)
* patch - support for search queries on top of flattened postgres table structure * added a customParam config to connectionConfig * support for contains and in relational filter for first class fields; added quotes around fields * added quotes around fields * addressed comments * added a few tests * nit-fixes
1 parent b091041 commit 32efd42

25 files changed

+475
-30
lines changed

document-store/src/main/java/org/hypertrace/core/documentstore/TypesafeDatastoreConfigAdapter.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.mongodb.MongoClientSettings;
77
import com.typesafe.config.Config;
88
import java.time.Duration;
9+
import java.util.Collections;
910
import org.hypertrace.core.documentstore.model.config.AggregatePipelineMode;
1011
import org.hypertrace.core.documentstore.model.config.DatabaseType;
1112
import org.hypertrace.core.documentstore.model.config.DatastoreConfig;
@@ -34,7 +35,8 @@ public DatastoreConfig convert(final Config config) {
3435
null,
3536
AggregatePipelineMode.DEFAULT_ALWAYS,
3637
DataFreshness.SYSTEM_DEFAULT,
37-
Duration.ofMinutes(20)) {
38+
Duration.ofMinutes(20),
39+
Collections.emptyMap()) {
3840
public MongoClientSettings toSettings() {
3941
final MongoClientSettings.Builder settingsBuilder =
4042
MongoClientSettings.builder()
@@ -88,7 +90,8 @@ public DatastoreConfig convert(final Config config) {
8890
connectionConfig.database(),
8991
connectionConfig.credentials(),
9092
connectionConfig.applicationName(),
91-
connectionConfig.connectionPoolConfig()) {
93+
connectionConfig.connectionPoolConfig(),
94+
connectionConfig.customParameters()) {
9295
@Override
9396
public String toConnectionString() {
9497
return config.hasPath("url")

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/ConnectionConfig.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import com.google.common.base.Preconditions;
66
import java.time.Duration;
77
import java.util.ArrayList;
8+
import java.util.Collections;
9+
import java.util.HashMap;
810
import java.util.List;
11+
import java.util.Map;
912
import javax.annotation.Nullable;
1013
import lombok.AccessLevel;
1114
import lombok.AllArgsConstructor;
@@ -34,18 +37,21 @@ public class ConnectionConfig {
3437
@NonNull AggregatePipelineMode aggregationPipelineMode;
3538
@NonNull DataFreshness dataFreshness;
3639
@NonNull Duration queryTimeout;
40+
@NonNull Map<String, String> customParameters;
3741

3842
public ConnectionConfig(
3943
@NonNull List<@NonNull Endpoint> endpoints,
4044
@NonNull String database,
41-
@Nullable ConnectionCredentials credentials) {
45+
@Nullable ConnectionCredentials credentials,
46+
Map<String, String> customParameters) {
4247
this(
4348
endpoints,
4449
database,
4550
credentials,
4651
AggregatePipelineMode.DEFAULT_ALWAYS,
4752
DataFreshness.SYSTEM_DEFAULT,
48-
Duration.ofMinutes(20));
53+
Duration.ofMinutes(20),
54+
customParameters != null ? customParameters : Collections.emptyMap());
4955
}
5056

5157
public static ConnectionConfigBuilder builder() {
@@ -63,6 +69,13 @@ public static class ConnectionConfigBuilder {
6369
ConnectionCredentials credentials;
6470
String applicationName = DEFAULT_APP_NAME;
6571
String replicaSet;
72+
Map<String, String> customParameters = new HashMap<>();
73+
74+
public ConnectionConfigBuilder customParameter(String key, String value) {
75+
this.customParameters.put(key, value);
76+
return this;
77+
}
78+
6679
ConnectionPoolConfig connectionPoolConfig;
6780
AggregatePipelineMode aggregationPipelineMode = AggregatePipelineMode.DEFAULT_ALWAYS;
6881
DataFreshness dataFreshness = DataFreshness.SYSTEM_DEFAULT;
@@ -96,15 +109,17 @@ public ConnectionConfig build() {
96109
connectionPoolConfig,
97110
aggregationPipelineMode,
98111
dataFreshness,
99-
queryTimeout);
112+
queryTimeout,
113+
customParameters);
100114

101115
case POSTGRES:
102116
return new PostgresConnectionConfig(
103117
unmodifiableList(endpoints),
104118
database,
105119
credentials,
106120
applicationName,
107-
connectionPoolConfig);
121+
connectionPoolConfig,
122+
customParameters);
108123
}
109124

110125
throw new IllegalArgumentException("Unsupported database type: " + type);

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@
1111
import org.hypertrace.core.documentstore.model.config.DatastoreConfig.DatastoreConfigBuilder;
1212
import org.hypertrace.core.documentstore.model.config.Endpoint.EndpointBuilder;
1313
import org.hypertrace.core.documentstore.model.options.DataFreshness;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
1416

1517
@Value
1618
public class TypesafeConfigDatastoreConfigExtractor {
19+
private static final Logger LOGGER =
20+
LoggerFactory.getLogger(TypesafeConfigDatastoreConfigExtractor.class);
1721
private static final String DEFAULT_HOST_KEY = "host";
1822
private static final String DEFAULT_PORT_KEY = "port";
1923
private static final String DEFAULT_ENDPOINTS_KEY = "endpoints";
@@ -29,6 +33,7 @@ public class TypesafeConfigDatastoreConfigExtractor {
2933
private static final String DEFAULT_AGGREGATION_PIPELINE_MODE_KEY = "aggregationPipelineMode";
3034
private static final String DEFAULT_DATA_FRESHNESS_KEY = "dataFreshness";
3135
private static final String DEFAULT_QUERY_TIMEOUT_KEY = "queryTimeout";
36+
private static final String DEFAULT_CUSTOM_PARAMETERS_PREFIX = "customParams";
3237

3338
@NonNull Config config;
3439
DatastoreConfigBuilder datastoreConfigBuilder;
@@ -74,7 +79,8 @@ private TypesafeConfigDatastoreConfigExtractor(
7479
.poolConnectionSurrenderTimeoutKey(DEFAULT_CONNECTION_IDLE_TIME_KEY)
7580
.aggregationPipelineMode(DEFAULT_AGGREGATION_PIPELINE_MODE_KEY)
7681
.dataFreshnessKey(DEFAULT_DATA_FRESHNESS_KEY)
77-
.queryTimeoutKey(DEFAULT_QUERY_TIMEOUT_KEY);
82+
.queryTimeoutKey(DEFAULT_QUERY_TIMEOUT_KEY)
83+
.customParametersKey(DEFAULT_CUSTOM_PARAMETERS_PREFIX);
7884
}
7985

8086
public static TypesafeConfigDatastoreConfigExtractor from(
@@ -169,6 +175,27 @@ public TypesafeConfigDatastoreConfigExtractor replicaSetKey(@NonNull final Strin
169175
return this;
170176
}
171177

178+
public TypesafeConfigDatastoreConfigExtractor customParametersKey(@NonNull final String key) {
179+
if (config.hasPath(key)) {
180+
try {
181+
// Try to extract parameters as an object (Config)
182+
Config paramConfig = config.getConfig(key);
183+
paramConfig
184+
.entrySet()
185+
.forEach(
186+
entry -> {
187+
connectionConfigBuilder.customParameter(
188+
entry.getKey(), paramConfig.getString(entry.getKey()));
189+
});
190+
} catch (Exception e) {
191+
// If not a Config object, log warning
192+
LOGGER.warn("Custom parameters key '{}' exists but is not a config object", key);
193+
}
194+
}
195+
196+
return this;
197+
}
198+
172199
public TypesafeConfigDatastoreConfigExtractor poolMaxConnectionsKey(@NonNull final String key) {
173200
if (config.hasPath(key)) {
174201
connectionPoolConfigBuilder.maxConnections(config.getInt(key));
@@ -228,6 +255,7 @@ public DatastoreConfig extract() {
228255
connectionConfigBuilder
229256
.connectionPoolConfig(connectionPoolConfigBuilder.build())
230257
.credentials(connectionCredentialsBuilder.build())
258+
.customParameters(connectionConfigBuilder.customParameters())
231259
.build())
232260
.build();
233261
}

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/mongo/MongoConnectionConfig.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.time.Duration;
1414
import java.util.ArrayList;
1515
import java.util.List;
16+
import java.util.Map;
1617
import java.util.Optional;
1718
import java.util.concurrent.TimeUnit;
1819
import javax.annotation.Nullable;
@@ -53,14 +54,16 @@ public MongoConnectionConfig(
5354
@Nullable final ConnectionPoolConfig connectionPoolConfig,
5455
@NonNull final AggregatePipelineMode aggregationPipelineMode,
5556
@NonNull final DataFreshness dataFreshness,
56-
@NonNull final Duration queryTimeout) {
57+
@NonNull final Duration queryTimeout,
58+
@NonNull final Map<String, String> customParameters) {
5759
super(
5860
ensureAtLeastOneEndpoint(endpoints),
5961
getDatabaseOrDefault(database),
6062
getCredentialsOrDefault(credentials, database),
6163
aggregationPipelineMode,
6264
dataFreshness,
63-
queryTimeout);
65+
queryTimeout,
66+
customParameters);
6467
this.applicationName = applicationName;
6568
this.replicaSetName = replicaSetName;
6669
this.connectionPoolConfig = getConnectionPoolConfigOrDefault(connectionPoolConfig);

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/postgres/PostgresConnectionConfig.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.ArrayList;
77
import java.util.List;
8+
import java.util.Map;
89
import java.util.Optional;
910
import java.util.Properties;
1011
import javax.annotation.Nullable;
@@ -45,11 +46,13 @@ public PostgresConnectionConfig(
4546
@Nullable final String database,
4647
@Nullable final ConnectionCredentials credentials,
4748
@NonNull final String applicationName,
48-
@Nullable final ConnectionPoolConfig connectionPoolConfig) {
49+
@Nullable final ConnectionPoolConfig connectionPoolConfig,
50+
@NonNull final Map<String, String> customParameters) {
4951
super(
5052
ensureSingleEndpoint(endpoints),
5153
getDatabaseOrDefault(database),
52-
getCredentialsOrDefault(credentials));
54+
getCredentialsOrDefault(credentials),
55+
customParameters);
5356
this.applicationName = applicationName;
5457
this.connectionPoolConfig = getConnectionPoolConfigOrDefault(connectionPoolConfig);
5558
}

document-store/src/main/java/org/hypertrace/core/documentstore/postgres/PostgresClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.sql.ResultSet;
77
import java.sql.SQLException;
88
import java.time.Duration;
9+
import java.util.Map;
910
import java.util.concurrent.TimeUnit;
1011
import org.hypertrace.core.documentstore.model.config.postgres.PostgresConnectionConfig;
1112
import org.hypertrace.core.documentstore.model.config.postgres.PostgresDefaults;
@@ -51,6 +52,10 @@ public Connection getPooledConnection() throws SQLException {
5152
return connectionPool.getConnection();
5253
}
5354

55+
public Map<String, String> getCustomParameters() {
56+
return connectionConfig.customParameters();
57+
}
58+
5459
public void close() {
5560
if (connection != null) {
5661
try {

0 commit comments

Comments
 (0)