Skip to content

Commit cc0ee22

Browse files
committed
Improved internal query API
1 parent 6af2973 commit cc0ee22

7 files changed

Lines changed: 96 additions & 64 deletions

File tree

FROST-Server.Core.Model/src/main/java/de/fraunhofer/iosb/ilt/frostserver/model/EntityChangedMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public Query getQueryFor(EntityType entityType) {
198198
Query subQuery = new Query(t.getModelRegistry(), queryDefaults, new ResourcePath("", Version.INTERNAL, "/" + np.getName()), INTERNAL_ADMIN_PRINCIPAL)
199199
.addSelect(np.getEntityType().getPrimaryKey().getKeyProperties())
200200
.setMetadata(Metadata.INTERNAL_COMPARE);
201-
query.addExpand(new Expand(t.getModelRegistry(), np).setSubQuery(subQuery));
201+
query.addExpand(new Expand(np).setSubQuery(subQuery));
202202
}
203203
return query;
204204
});

FROST-Server.Core.Model/src/main/java/de/fraunhofer/iosb/ilt/frostserver/query/Expand.java

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import de.fraunhofer.iosb.ilt.frostserver.property.NavigationPropertyCustom;
3030
import de.fraunhofer.iosb.ilt.frostserver.property.NavigationPropertyMain;
3131
import de.fraunhofer.iosb.ilt.frostserver.property.Property;
32+
import de.fraunhofer.iosb.ilt.frostserver.util.StringHelper;
3233
import java.util.ArrayList;
3334
import java.util.Arrays;
3435
import java.util.List;
@@ -41,36 +42,38 @@
4142
*/
4243
public class Expand {
4344

44-
private ModelRegistry modelRegistry;
4545
private List<String> rawPath;
4646
private NavigationProperty validatedPath;
4747
private Query parentQuery;
4848
private Query subQuery;
4949

50-
public Expand(ModelRegistry modelRegistry) {
51-
this.modelRegistry = modelRegistry;
50+
public Expand() {
5251
}
5352

54-
public Expand(ModelRegistry modelRegistry, Query subQuery) {
55-
this.modelRegistry = modelRegistry;
53+
public Expand(Query subQuery) {
5654
if (subQuery != null) {
5755
setSubQuery(subQuery);
5856
}
5957
}
6058

61-
public Expand(ModelRegistry modelRegistry, NavigationProperty path) {
59+
public Expand(String path) {
60+
if (StringHelper.isNullOrEmpty(path)) {
61+
throw new IllegalArgumentException("path must be non-empty");
62+
}
63+
addToRawPath(path);
64+
}
65+
66+
public Expand(NavigationProperty path) {
6267
if (path == null) {
6368
throw new IllegalArgumentException("path must be non-empty");
6469
}
65-
this.modelRegistry = modelRegistry;
6670
this.validatedPath = path;
6771
}
6872

69-
public Expand(ModelRegistry modelRegistry, Query subQuery, NavigationProperty path) {
73+
public Expand(Query subQuery, NavigationProperty path) {
7074
if (path == null) {
7175
throw new IllegalArgumentException("paths must be non-empty");
7276
}
73-
this.modelRegistry = modelRegistry;
7477
this.validatedPath = path;
7578
setSubQuery(subQuery);
7679
}
@@ -79,11 +82,12 @@ public NavigationProperty getPath() {
7982
return validatedPath;
8083
}
8184

82-
public void addToRawPath(String subPath) {
85+
public final Expand addToRawPath(String subPath) {
8386
if (rawPath == null) {
8487
rawPath = new ArrayList<>();
8588
}
8689
this.rawPath.add(subPath);
90+
return this;
8791
}
8892

8993
public List<String> getRawPath() {
@@ -135,6 +139,7 @@ public void validate(ParserContext context, ResourcePath path) {
135139

136140
protected void validate(ParserContext context, EntityType entityType) {
137141
if (validatedPath == null) {
142+
ModelRegistry modelRegistry = parentQuery.getModelRegistry();
138143
final String firstRawPath = rawPath.get(0);
139144
final Property property = entityType.getProperty(firstRawPath);
140145
final int rawCount = rawPath.size();
@@ -145,7 +150,7 @@ protected void validate(ParserContext context, EntityType entityType) {
145150
validatedPath = npm;
146151
if (rawCount > 1) {
147152
// Need to re-nest this expand!
148-
Expand subExpand = new Expand(modelRegistry, subQuery);
153+
Expand subExpand = new Expand(subQuery);
149154
for (int i = 1; i < rawCount; i++) {
150155
subExpand.addToRawPath(rawPath.get(i));
151156
}

FROST-Server.Core.Model/src/main/java/de/fraunhofer/iosb/ilt/frostserver/query/Query.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,19 @@ public Query(Query expandParent) {
116116
* @param principal the user principal.
117117
*/
118118
public Query(ModelRegistry modelRegistry, QueryDefaults settings, ResourcePath path, PrincipalExtended principal) {
119+
this(modelRegistry, settings, principal);
120+
setPath(path);
121+
}
122+
123+
/**
124+
* Create a Query with the given model registry, settings, path and user.
125+
*
126+
* @param modelRegistry the model registry to use.
127+
* @param settings the setting to use.
128+
* @param principal the user principal.
129+
*/
130+
public Query(ModelRegistry modelRegistry, QueryDefaults settings, PrincipalExtended principal) {
119131
this.modelRegistry = modelRegistry;
120-
this.path = path;
121132
this.queryDefaults = settings;
122133
this.principal = principal;
123134
this.top = Optional.empty();
@@ -238,8 +249,9 @@ public ResourcePath getPath() {
238249
return path;
239250
}
240251

241-
public void setPath(ResourcePath path) {
252+
public final Query setPath(ResourcePath path) {
242253
this.path = path;
254+
return this;
243255
}
244256

245257
public String getServiceRootUrl() {

FROST-Server.Core/src/main/java/de/fraunhofer/iosb/ilt/frostserver/parser/query/QueryParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public void visit(T_O_EXPAND node) {
264264
}
265265

266266
public void handle(P_ExpandItem expandItem) {
267-
Expand expand = new Expand(settings.getModelRegistry());
267+
Expand expand = new Expand();
268268
List<P_PlainPath> paths = expandItem.childrenOfType(P_PlainPath.class);
269269
if (paths.isEmpty()) {
270270
return;

FROST-Server.Core/src/main/java/de/fraunhofer/iosb/ilt/frostserver/service/ServiceRequest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919

2020
import de.fraunhofer.iosb.ilt.frostserver.json.deserialize.JsonReader;
2121
import de.fraunhofer.iosb.ilt.frostserver.json.deserialize.JsonReaderDefault;
22+
import de.fraunhofer.iosb.ilt.frostserver.parser.path.PathParser;
2223
import de.fraunhofer.iosb.ilt.frostserver.path.EditFeatures;
24+
import de.fraunhofer.iosb.ilt.frostserver.path.ResourcePath;
2325
import de.fraunhofer.iosb.ilt.frostserver.path.Version;
26+
import de.fraunhofer.iosb.ilt.frostserver.query.Query;
2427
import de.fraunhofer.iosb.ilt.frostserver.query.QueryDefaults;
2528
import de.fraunhofer.iosb.ilt.frostserver.settings.CoreSettings;
2629
import de.fraunhofer.iosb.ilt.frostserver.util.user.PrincipalExtended;
@@ -316,4 +319,22 @@ public static void removeLocalRequest() {
316319
PrincipalExtended.removeLocalPrincipal();
317320
}
318321

322+
/**
323+
* Create a new Path with the settings of this request.
324+
*
325+
* @param path The path-string to create the path with.
326+
* @return a new ResourcePath.
327+
*/
328+
public ResourcePath newPath(String path) {
329+
return PathParser.parsePath(coreSettings.getModelRegistry(), queryDefaults.getServiceRootUrl(), version, path);
330+
}
331+
332+
/**
333+
* Create a new Query with the settings and user of this request.
334+
*
335+
* @return a new Query.
336+
*/
337+
public Query newQuery() {
338+
return new Query(coreSettings.getModelRegistry(), coreSettings.getQueryDefaults(), userPrincipal);
339+
}
319340
}

FROST-Server.Core/src/test/java/de/fraunhofer/iosb/ilt/frostserver/query/QueryParserTest.java

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ void testSelectMultipleMixed() {
750750
void testExpandSingleNavigationProperty() {
751751
String query = "$expand=Rooms";
752752
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
753-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS));
753+
expResult.getExpand().add(new Expand(testModel.NP_HOUSE_ROOMS));
754754
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
755755
result.validate(testModel.ET_HOUSE);
756756
assertEquals(expResult, result);
@@ -760,7 +760,7 @@ void testExpandSingleNavigationProperty() {
760760
void testExpandSingleNavigationPropertyEmpty() {
761761
String query = "$expand=Rooms()";
762762
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
763-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS));
763+
expResult.getExpand().add(new Expand(testModel.NP_HOUSE_ROOMS));
764764
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
765765
result.validate(testModel.ET_HOUSE);
766766
assertEquals(expResult, result);
@@ -770,9 +770,9 @@ void testExpandSingleNavigationPropertyEmpty() {
770770
void testExpandDeep() {
771771
String query = "$expand=Rooms/House";
772772
Query subQuery = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
773-
subQuery.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
773+
subQuery.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
774774
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
775-
expResult.getExpand().add(new Expand(modelRegistry, subQuery, testModel.NP_HOUSE_ROOMS));
775+
expResult.getExpand().add(new Expand(subQuery, testModel.NP_HOUSE_ROOMS));
776776
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
777777
result.validate(testModel.ET_HOUSE);
778778
assertEquals(expResult, result);
@@ -787,7 +787,6 @@ void testExpandCustom() {
787787
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
788788
.addExpand(
789789
new Expand(
790-
modelRegistry,
791790
new NavigationPropertyCustom(modelRegistry, ModelRegistry.EP_PROPERTIES)
792791
.addToSubPath("sub")
793792
.addToSubPath("link.House")));
@@ -806,10 +805,9 @@ void testExpandCustom2() {
806805
{
807806
String query = "$expand=Houses,properties/link.House";
808807
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
809-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSES))
808+
.addExpand(new Expand(testModel.NP_HOUSES))
810809
.addExpand(
811810
new Expand(
812-
modelRegistry,
813811
new NavigationPropertyCustom(modelRegistry, ModelRegistry.EP_PROPERTIES)
814812
.addToSubPath("link.House")));
815813
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
@@ -820,10 +818,9 @@ void testExpandCustom2() {
820818
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
821819
.addExpand(
822820
new Expand(
823-
modelRegistry,
824821
new NavigationPropertyCustom(modelRegistry, ModelRegistry.EP_PROPERTIES)
825822
.addToSubPath("link.House")))
826-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSES));
823+
.addExpand(new Expand(testModel.NP_HOUSES));
827824
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
828825
assertEquals(expResult, result);
829826
}
@@ -838,9 +835,9 @@ void testExpandDeepQuery() {
838835
Query subQuery = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
839836
Query subSubQuery = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
840837
subSubQuery.getSelect().add(testModel.ET_HOUSE.getPrimaryKey().getKeyProperties().get(0));
841-
subQuery.getExpand().add(new Expand(modelRegistry, subSubQuery, testModel.NP_ROOM_HOUSE));
838+
subQuery.getExpand().add(new Expand(subSubQuery, testModel.NP_ROOM_HOUSE));
842839
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
843-
expResult.getExpand().add(new Expand(modelRegistry, subQuery, testModel.NP_HOUSE_ROOMS));
840+
expResult.getExpand().add(new Expand(subQuery, testModel.NP_HOUSE_ROOMS));
844841
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
845842
result.validate(testModel.ET_HOUSE);
846843
assertEquals(expResult, result);
@@ -850,8 +847,8 @@ void testExpandDeepQuery() {
850847
void testExpandMultipleNavigationProperties() {
851848
String query = "$expand=Rooms,House";
852849
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
853-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS));
854-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
850+
expResult.getExpand().add(new Expand(testModel.NP_HOUSE_ROOMS));
851+
expResult.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
855852
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
856853
assertEquals(expResult, result);
857854
}
@@ -860,10 +857,10 @@ void testExpandMultipleNavigationProperties() {
860857
void testExpandMultipleNavigationPropertiesDeep1() {
861858
String query = "$expand=Rooms/House,Rooms/Rooms";
862859
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
863-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS)
860+
.addExpand(new Expand(testModel.NP_HOUSE_ROOMS)
864861
.setSubQuery(new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
865-
.addExpand(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE))
866-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS))));
862+
.addExpand(new Expand(testModel.NP_ROOM_HOUSE))
863+
.addExpand(new Expand(testModel.NP_HOUSE_ROOMS))));
867864
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
868865
result.validate(testModel.ET_HOUSE);
869866
assertEquals(expResult, result);
@@ -873,10 +870,10 @@ void testExpandMultipleNavigationPropertiesDeep1() {
873870
void testExpandMultipleNavigationPropertiesDeep2() {
874871
String query = "$expand=Houses($expand=Rooms,House)";
875872
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
876-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSES)
873+
.addExpand(new Expand(testModel.NP_HOUSES)
877874
.setSubQuery(new Query(modelRegistry, coreSettings.getQueryDefaults(), path)
878-
.addExpand(new Expand(modelRegistry, testModel.NP_HOUSE_ROOMS))
879-
.addExpand(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE))));
875+
.addExpand(new Expand(testModel.NP_HOUSE_ROOMS))
876+
.addExpand(new Expand(testModel.NP_ROOM_HOUSE))));
880877
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
881878
assertEquals(expResult, result);
882879
}
@@ -887,14 +884,14 @@ void testExpandWithSubquery() {
887884
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
888885
Query subQuery = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
889886
subQuery.setFilter(new Equal(new Path(testModel.EP_VALUE), new IntegerConstant(1)));
890-
subQuery.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
887+
subQuery.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
891888
subQuery.getSelect().add(testModel.ET_ROOM.getPrimaryKey().getKeyProperties().get(0));
892889
subQuery.getOrderBy().add(new OrderBy(new Path(testModel.ET_ROOM.getPrimaryKey().getKeyProperties().get(0))));
893890
subQuery.setSkip(5);
894891
subQuery.setTop(10);
895892
subQuery.setCount(true);
896-
expResult.getExpand().add(new Expand(modelRegistry, subQuery, testModel.NP_HOUSE_ROOMS));
897-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
893+
expResult.getExpand().add(new Expand(subQuery, testModel.NP_HOUSE_ROOMS));
894+
expResult.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
898895
expResult.setTop(10);
899896
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
900897
result.validate(testModel.ET_ROOM);
@@ -907,10 +904,10 @@ void testComplex1() {
907904
Query expResult = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
908905
Query subQuery1 = new Query(modelRegistry, coreSettings.getQueryDefaults(), path);
909906
subQuery1.setFilter(new Equal(new Path(testModel.EP_VALUE), new IntegerConstant(1)));
910-
subQuery1.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
907+
subQuery1.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
911908
subQuery1.getSelect().add(testModel.ET_ROOM.getPrimaryKey().getKeyProperties().get(0));
912-
expResult.getExpand().add(new Expand(modelRegistry, subQuery1, testModel.NP_HOUSE_ROOMS));
913-
expResult.getExpand().add(new Expand(modelRegistry, testModel.NP_ROOM_HOUSE));
909+
expResult.getExpand().add(new Expand(subQuery1, testModel.NP_HOUSE_ROOMS));
910+
expResult.getExpand().add(new Expand(testModel.NP_ROOM_HOUSE));
914911
expResult.setTop(10);
915912
Query result = QueryParser.parseQuery(query, coreSettings.getQueryDefaults(), coreSettings, path);
916913
result.validate(testModel.ET_ROOM);

0 commit comments

Comments
 (0)