Skip to content

Commit 87a698f

Browse files
author
Maciej Rosiek
committed
Implemented DatabaseField annotation parameter that allows to specify more java side field than in postgres type
1 parent 5cbda1f commit 87a698f

File tree

11 files changed

+139
-10
lines changed

11 files changed

+139
-10
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
create type partial_object as (
2+
name text
3+
);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE OR REPLACE FUNCTION get_partial_object(p partial_object)
2+
RETURNS partial_object AS
3+
$$
4+
DECLARE
5+
r partial_object;
6+
BEGIN
7+
r.name := p.name;
8+
return r;
9+
END;
10+
$$ LANGUAGE plpgsql SECURITY DEFINER;

src/main/java/de/zalando/typemapper/annotations/DatabaseField.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,4 @@
3535

3636
Class<? extends ObjectMapper<?>> mapper() default DefaultObjectMapper.class;
3737

38-
boolean optional() default false;
3938
}

src/main/java/de/zalando/typemapper/annotations/DatabaseType.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,10 @@
2020
* Flattens hierarchical structure of object and makes parent fields exposed to PgTypeHelper.
2121
*/
2222
boolean inheritance() default false;
23+
24+
/**
25+
* Annotated java class can have more @DatabaseField annotated fields than corresponding database type.
26+
*/
27+
boolean partial() default false;
28+
2329
}

src/main/java/de/zalando/typemapper/core/DatabaseFieldDescriptor.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,18 @@ public class DatabaseFieldDescriptor {
1111
private int position;
1212
private Class<? extends ValueTransformer<?, ?>> transformer;
1313
private Class<? extends ObjectMapper<?>> mapper;
14-
private boolean optional;
1514

1615
public DatabaseFieldDescriptor(final DatabaseField databaseField) {
1716
this.name = databaseField.name();
1817
this.position = databaseField.position();
1918
this.transformer = databaseField.transformer();
2019
this.mapper = databaseField.mapper();
21-
this.optional = databaseField.optional();
2220
}
2321

2422
public DatabaseFieldDescriptor(final Column column) {
2523
this.name = column.name();
2624
this.position = -1;
2725
this.transformer = AnyTransformer.class;
28-
this.optional = false;
2926
}
3027

3128
public String getName() {
@@ -44,8 +41,4 @@ public Class<? extends ObjectMapper<?>> getMapper() {
4441
return mapper;
4542
}
4643

47-
public boolean isOptional() {
48-
return optional;
49-
}
50-
5144
}

src/main/java/de/zalando/typemapper/postgres/PgTypeHelper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ public int compare(final Field a, final Field b) {
314314
dbField = dbFields.get(dbFieldName);
315315

316316
if (dbField == null) {
317-
if (!databaseFieldDescriptor.isOptional()) {
317+
if (databaseType == null || !databaseType.partial()) {
318318
throw new IllegalArgumentException("Field " + f.getName() + " (" + dbFieldName
319319
+ ") of class " + clazz.getSimpleName()
320320
+ " could not be found in database type " + typeName);
@@ -329,7 +329,7 @@ public int compare(final Field a, final Field b) {
329329
resultList = new ArrayList<Object>();
330330
}
331331

332-
if (!databaseFieldDescriptor.isOptional()) {
332+
if (databaseType == null || !databaseType.partial()) {
333333
resultList.add(value);
334334
}
335335
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package de.zalando.sprocwrapper;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
import org.junit.runner.RunWith;
7+
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
10+
import org.springframework.test.context.ContextConfiguration;
11+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12+
13+
import de.zalando.sprocwrapper.example.ExampleSProcService;
14+
import de.zalando.sprocwrapper.example.NotPartialObject;
15+
import de.zalando.sprocwrapper.example.PartialObject;
16+
17+
@RunWith(SpringJUnit4ClassRunner.class)
18+
@ContextConfiguration(locations = {"classpath:backendContextTest.xml"})
19+
public class PartialDatabaseTypeIT {
20+
21+
@Autowired
22+
private ExampleSProcService exampleSProcService;
23+
24+
@Test
25+
public void testPartialObject() {
26+
PartialObject partialObject = new PartialObject();
27+
partialObject.setId(999);
28+
partialObject.setName("Test Name");
29+
30+
PartialObject partialObjectDb = exampleSProcService.getPartialObject(partialObject);
31+
32+
Assert.assertEquals(0, partialObjectDb.getId());
33+
Assert.assertEquals("Test Name", partialObjectDb.getName());
34+
}
35+
36+
@Test(expected = IllegalArgumentException.class)
37+
public void testNotPartialObject() {
38+
exampleSProcService.getPartialObject(new NotPartialObject());
39+
}
40+
41+
}

src/test/java/de/zalando/sprocwrapper/example/ExampleSProcService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,11 @@ int createOrder(@SProcParam String orderNumber, @SProcParam OrderMonetaryAmount
279279

280280
@SProcCall(sql = "SELECT version()")
281281
String getPostgreSqlVersion();
282+
283+
@SProcCall
284+
PartialObject getPartialObject(@SProcParam PartialObject partialObject);
285+
286+
@SProcCall
287+
PartialObject getPartialObject(@SProcParam NotPartialObject partialObject);
288+
282289
}

src/test/java/de/zalando/sprocwrapper/example/ExampleSProcServiceImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,4 +443,14 @@ public String getValueFromBasicTable(@SProcParam final String key) {
443443
public String getPostgreSqlVersion() {
444444
return sproc.getPostgreSqlVersion();
445445
}
446+
447+
@Override
448+
public PartialObject getPartialObject(final PartialObject partialObject) {
449+
return sproc.getPartialObject(partialObject);
450+
}
451+
452+
@Override
453+
public PartialObject getPartialObject(final NotPartialObject notPartialObject) {
454+
return sproc.getPartialObject(notPartialObject);
455+
}
446456
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package de.zalando.sprocwrapper.example;
2+
3+
import de.zalando.typemapper.annotations.DatabaseField;
4+
import de.zalando.typemapper.annotations.DatabaseType;
5+
6+
@DatabaseType(name = "partial_object")
7+
public class NotPartialObject {
8+
9+
@DatabaseField
10+
private int id;
11+
@DatabaseField
12+
private String name;
13+
14+
public void setId(final int id) {
15+
this.id = id;
16+
}
17+
18+
public int getId() {
19+
return id;
20+
}
21+
22+
public void setName(final String name) {
23+
this.name = name;
24+
}
25+
26+
public String getName() {
27+
return name;
28+
}
29+
30+
}

0 commit comments

Comments
 (0)