Skip to content

Commit b786972

Browse files
committed
Updates and improvements to Entity Generator script - not storing 'payload' or any other field unless required.
1 parent a1315c6 commit b786972

6 files changed

Lines changed: 700 additions & 394 deletions

File tree

memex/README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,9 @@ goal below. customId shodu lmap to the id
408408
field in the JSON
409409

410410
```shell
411-
mvn generate-sources -Pgenerate-models-from-json -DjsonFile=path/to/sample.json -DbasePackage=com.johnlpage.memex.model -DcollectionName=myCollectio -DidFieldName=myCustomId
411+
412+
mvn generate-sources -Pgenerate-models-from-json -DjsonFile=../companies250k.json -DbasePackage=com.johnlpage.memex -Dentity=Company -DidFieldName=companyNumber
413+
412414
```
413415

414416
# Testing

memex/src/main/java/com/johnlpage/memex/VehicleInspection/model/VehicleInspection.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
package com.johnlpage.memex.VehicleInspection.model;
22

3-
import com.fasterxml.jackson.annotation.*;
3+
import com.fasterxml.jackson.annotation.JsonAnyGetter;
4+
import com.fasterxml.jackson.annotation.JsonAnySetter;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.annotation.JsonInclude;
47
import com.johnlpage.memex.util.DeleteFlag;
58
import com.johnlpage.memex.util.ObjectConverter;
6-
import jakarta.validation.constraints.*;
7-
8-
import java.util.Date;
9-
import java.util.HashMap;
10-
import java.util.Map;
11-
9+
import jakarta.validation.constraints.Min;
1210
import lombok.Data;
1311
import org.springframework.data.annotation.Id;
1412
import org.springframework.data.annotation.Transient;
1513
import org.springframework.data.annotation.Version;
1614
import org.springframework.data.mongodb.core.mapping.Document;
1715
import org.springframework.data.mongodb.core.mapping.Field;
1816

17+
import java.util.Date;
18+
import java.util.HashMap;
19+
import java.util.Map;
20+
1921
/* Replace @Data with this to make an Immutable model
2022
* which is a little more efficient but no setters just a builder
2123
* This also impact the controller and fuzzer and JsonLoaderService -
@@ -58,17 +60,30 @@ public class VehicleInspection {
5860
Boolean deleted;
5961

6062
/**
61-
* Use this to capture any fields not captured explicitly As MongoDB's flexibility makes this easy
63+
* Captures any fields not explicitly mapped to class fields.
64+
* Supports schema flexibility and evolution.
65+
* Only persisted/serialized when non-empty.
6266
*/
63-
private Map<String, Object> payload = new HashMap<>();
67+
@Field(write = Field.Write.NON_NULL)
68+
private Map<String, Object> payload;
6469

6570
@JsonAnySetter
6671
public void set(String key, Object value) {
72+
if (payload == null) {
73+
payload = new HashMap<String, Object>();
74+
}
6775
payload.put(key, ObjectConverter.convertObject(value));
6876
}
6977

7078
@JsonAnyGetter
7179
public Map<String, Object> getPayload() {
7280
return payload;
7381
}
82+
83+
/**
84+
* Helper method to safely add to payload from your own code
85+
*/
86+
public void addToPayload(String key, Object value) {
87+
set(key, value);
88+
}
7489
}

memex/src/main/java/com/johnlpage/memex/config/MongoConfig.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,31 @@
55
import org.bson.Document;
66
import org.slf4j.Logger;
77
import org.slf4j.LoggerFactory;
8-
import org.springframework.beans.factory.InitializingBean;
98
import org.springframework.beans.factory.annotation.Autowired;
109
import org.springframework.context.annotation.Bean;
1110
import org.springframework.context.annotation.Configuration;
12-
import org.springframework.context.annotation.Lazy;
1311
import org.springframework.data.mongodb.MongoDatabaseFactory;
1412
import org.springframework.data.mongodb.MongoTransactionManager;
15-
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
16-
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
13+
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
1714
import org.springframework.transaction.annotation.EnableTransactionManagement;
1815

1916
@Configuration
2017
@EnableTransactionManagement(proxyTargetClass = true)
21-
public class MongoConfig implements InitializingBean {
18+
public class MongoConfig {
2219
private static final Logger LOG = LoggerFactory.getLogger(MongoConfig.class);
23-
final MongoDatabaseFactory mongoDatabaseFactory;
24-
@Lazy
25-
private final MappingMongoConverter mappingMongoConverter;
20+
21+
private final MongoDatabaseFactory mongoDatabaseFactory;
2622

2723
@Autowired
28-
public MongoConfig(
29-
MongoDatabaseFactory mongoDatabaseFactory, MappingMongoConverter mappingMongoConverter) {
24+
public MongoConfig(MongoDatabaseFactory mongoDatabaseFactory) {
3025
this.mongoDatabaseFactory = mongoDatabaseFactory;
31-
this.mappingMongoConverter = mappingMongoConverter;
26+
}
27+
28+
@Bean
29+
public MongoCustomConversions customConversions() {
30+
return MongoCustomConversions.create(adapter ->
31+
adapter.useNativeDriverJavaTimeCodecs()
32+
);
3233
}
3334

3435
/**
@@ -37,25 +38,13 @@ public MongoConfig(
3738
@Bean
3839
public MongoTransactionManager transactionManager() {
3940
LOG.info("MongoDB Native Transactions Enabled");
40-
4141
return new MongoTransactionManager(mongoDatabaseFactory);
4242
}
4343

4444
@Bean
4545
public MongoVersionBean mongoVersionBean(MongoClient mongoClient) {
46-
// TODO - Detect if Atlas Search available
4746
Document buildInfo = mongoClient.getDatabase("admin").runCommand(new Document("buildInfo", 1));
48-
4947
String version = buildInfo.getString("version");
50-
5148
return new MongoVersionBean(version);
5249
}
53-
54-
@Override
55-
public void afterPropertiesSet() {
56-
// We are disabling the _class field here as it has a significant impact on query performance
57-
// When it gets included in queries but is not in the index. You only need it when you have
58-
// polymorphism for a collection.
59-
mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
60-
}
6150
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.johnlpage.memex.config;
2+
3+
import jakarta.annotation.PostConstruct;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
7+
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
8+
9+
@Configuration
10+
public class MongoTypeMapperConfig {
11+
12+
private final MappingMongoConverter mappingMongoConverter;
13+
14+
@Autowired
15+
public MongoTypeMapperConfig(MappingMongoConverter mappingMongoConverter) {
16+
this.mappingMongoConverter = mappingMongoConverter;
17+
}
18+
19+
@PostConstruct
20+
public void removeClassField() {
21+
// Disabling the _class field as it has a significant impact on query performance
22+
// when included in queries but not in the index.
23+
mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
24+
}
25+
}

0 commit comments

Comments
 (0)