Skip to content

Commit 37fd3e7

Browse files
authored
Merge pull request #603 from peter-plochan/find-by-plurals
support irregular query type plurals in find by query resource
2 parents f0dfc5b + cf5b5ca commit 37fd3e7

2 files changed

Lines changed: 65 additions & 34 deletions

File tree

src/main/java/com/gooddata/md/MetadataService.java

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
import java.util.ArrayList;
2020
import java.util.Collection;
2121
import java.util.Collections;
22+
import java.util.HashSet;
2223
import java.util.List;
2324
import java.util.Map;
25+
import java.util.Set;
2426
import java.util.stream.Collectors;
2527

2628
import static com.gooddata.util.Validate.noNullElements;
@@ -32,6 +34,8 @@
3234
*/
3335
public class MetadataService extends AbstractService {
3436

37+
private static final Set<String> IRREGULAR_PLURAL_WORD_SUFFIXES = new HashSet<>(asList("s", "ch", "sh", "x", "o"));
38+
3539
public MetadataService(final RestTemplate restTemplate, final GoodDataSettings settings) {
3640
super(restTemplate, settings);
3741
}
@@ -278,8 +282,7 @@ public <T extends Queryable> Collection<Entry> find(Project project, Class<T> cl
278282
notNull(project.getId(), "project.id");
279283
notNull(cls, "cls");
280284

281-
final String type = cls.getSimpleName().toLowerCase() +
282-
(cls.isAssignableFrom(ReportDefinition.class) ? "" : "s");
285+
final String type = getQueryType(cls);
283286
try {
284287
final Query queryResult = restTemplate.getForObject(Query.URI, Query.class, project.getId(), type);
285288

@@ -293,29 +296,6 @@ public <T extends Queryable> Collection<Entry> find(Project project, Class<T> cl
293296
}
294297
}
295298

296-
private Collection<Entry> filterEntries(Collection<Entry> entries, Restriction... restrictions) {
297-
if (restrictions == null || restrictions.length == 0) {
298-
return entries;
299-
}
300-
final Collection<Entry> result = new ArrayList<>(entries.size());
301-
for (Entry entry : entries) {
302-
for (Restriction restriction : restrictions) {
303-
switch (restriction.getType()) {
304-
case IDENTIFIER:
305-
if (restriction.getValue().equals(entry.getIdentifier())) result.add(entry);
306-
break;
307-
case TITLE:
308-
if (restriction.getValue().equals(entry.getTitle())) result.add(entry);
309-
break;
310-
case SUMMARY:
311-
if (restriction.getValue().equals(entry.getSummary())) result.add(entry);
312-
break;
313-
}
314-
}
315-
}
316-
return result;
317-
}
318-
319299
/**
320300
* Find metadata URIs by restrictions like identifier, title or summary.
321301
*
@@ -470,6 +450,29 @@ public List<AttributeElement> getAttributeElements(DisplayForm displayForm) {
470450
}
471451
}
472452

453+
private Collection<Entry> filterEntries(Collection<Entry> entries, Restriction... restrictions) {
454+
if (restrictions == null || restrictions.length == 0) {
455+
return entries;
456+
}
457+
final Collection<Entry> result = new ArrayList<>(entries.size());
458+
for (Entry entry : entries) {
459+
for (Restriction restriction : restrictions) {
460+
switch (restriction.getType()) {
461+
case IDENTIFIER:
462+
if (restriction.getValue().equals(entry.getIdentifier())) result.add(entry);
463+
break;
464+
case TITLE:
465+
if (restriction.getValue().equals(entry.getTitle())) result.add(entry);
466+
break;
467+
case SUMMARY:
468+
if (restriction.getValue().equals(entry.getSummary())) result.add(entry);
469+
break;
470+
}
471+
}
472+
}
473+
return result;
474+
}
475+
473476
private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Collection<String> identifiers) {
474477
final IdentifiersAndUris response;
475478
try {
@@ -479,4 +482,18 @@ private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Co
479482
}
480483
return response;
481484
}
485+
486+
private <T extends Queryable> String getQueryType(final Class<T> cls) {
487+
final String typeBase = cls.getSimpleName().toLowerCase();
488+
489+
if (ReportDefinition.class.equals(cls)) {
490+
return typeBase;
491+
}
492+
493+
if (IRREGULAR_PLURAL_WORD_SUFFIXES.stream().anyMatch(typeBase::endsWith)) {
494+
return typeBase + "es";
495+
}
496+
497+
return typeBase + "s";
498+
}
482499
}

src/test/java/com/gooddata/md/MetadataServiceTest.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.gooddata.GoodDataSettings;
1111
import com.gooddata.gdc.UriResponse;
1212
import com.gooddata.md.report.ReportDefinition;
13+
import com.gooddata.md.visualization.VisualizationClass;
1314
import com.gooddata.project.Project;
1415
import org.mockito.Matchers;
1516
import org.mockito.Mock;
@@ -32,6 +33,8 @@
3233
import static org.hamcrest.CoreMatchers.notNullValue;
3334
import static org.hamcrest.MatcherAssert.assertThat;
3435
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
36+
import static org.mockito.Matchers.any;
37+
import static org.mockito.Matchers.anyString;
3538
import static org.mockito.Matchers.eq;
3639
import static org.mockito.Mockito.doThrow;
3740
import static org.mockito.Mockito.mock;
@@ -276,7 +279,7 @@ public void testGetObjUriToFindOneObjByTitle() throws Exception {
276279
final Entry resultEntry = mock(Entry.class);
277280
final String uri = "myURI";
278281
final String title = "myTitle";
279-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
282+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
280283
when(queryResult.getEntries()).thenReturn(asList(resultEntry));
281284
when(resultEntry.getTitle()).thenReturn(title);
282285
when(resultEntry.getUri()).thenReturn(uri);
@@ -290,7 +293,7 @@ public void testGetObjUriMoreThanOneResult() throws Exception {
290293
final Query queryResult = mock(Query.class);
291294
final Entry resultEntry1 = mock(Entry.class);
292295
final Entry resultEntry2 = mock(Entry.class);
293-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
296+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
294297
when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2));
295298

296299
service.getObjUri(project, Queryable.class);
@@ -301,7 +304,7 @@ public void testGetObjUriNothingFound() throws Exception {
301304
final Query queryResult = mock(Query.class);
302305
final Entry resultEntry = mock(Entry.class);
303306
final String title = "myTitle";
304-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
307+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
305308
when(queryResult.getEntries()).thenReturn(asList(resultEntry));
306309

307310
service.getObjUri(project, Queryable.class, Restriction.title(title));
@@ -314,7 +317,7 @@ public void testGetObjToFindOneObjById() throws Exception {
314317
final Entry resultEntry = mock(Entry.class);
315318
final String uri = "myURI";
316319
final String id = "myId";
317-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
320+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
318321
when(queryResult.getEntries()).thenReturn(asList(resultEntry));
319322
when(resultEntry.getIdentifier()).thenReturn(id);
320323
when(resultEntry.getUri()).thenReturn(uri);
@@ -329,7 +332,7 @@ public void testGetObjMoreThanOneResult() throws Exception {
329332
final Query queryResult = mock(Query.class);
330333
final Entry resultEntry1 = mock(Entry.class);
331334
final Entry resultEntry2 = mock(Entry.class);
332-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
335+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
333336
when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2));
334337

335338
service.getObj(project, Queryable.class);
@@ -340,7 +343,7 @@ public void testGetObjNothingFound() throws Exception {
340343
final Query queryResult = mock(Query.class);
341344
final Entry resultEntry = mock(Entry.class);
342345
final String title = "myTitle";
343-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
346+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
344347
when(queryResult.getEntries()).thenReturn(asList(resultEntry));
345348

346349
service.getObj(project, Queryable.class, Restriction.title(title));
@@ -351,16 +354,27 @@ public void testFindMoreResults() throws Exception {
351354
final Query queryResult = mock(Query.class);
352355
final Entry resultEntry1 = mock(Entry.class);
353356
final Entry resultEntry2 = mock(Entry.class);
354-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
357+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
355358
when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2));
356359

357360
final Collection<Entry> results = service.find(project, Queryable.class);
358361
assertThat(results, allOf(hasItem(resultEntry1), hasItem(resultEntry2)));
359362
}
360363

364+
@Test
365+
public void testFindIrregularQueryTypeNames() {
366+
when(restTemplate.getForObject(anyString(), any(), anyString(), anyString())).thenReturn(mock(Query.class));
367+
368+
service.find(project, ReportDefinition.class);
369+
verify(restTemplate).getForObject(Query.URI, Query.class, project.getId(), "reportdefinition");
370+
371+
service.find(project, VisualizationClass.class);
372+
verify(restTemplate).getForObject(Query.URI, Query.class, project.getId(), "visualizationclasses");
373+
}
374+
361375
@Test(expectedExceptions = GoodDataException.class)
362376
public void testFindWithWithClientSideHTTPError() throws Exception {
363-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenThrow(new RestClientException(""));
377+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenThrow(new RestClientException(""));
364378
service.find(project, Queryable.class);
365379
}
366380

@@ -372,7 +386,7 @@ public void testFindUrisBySummary() throws Exception {
372386
final String summary = "mySummary";
373387
final String uri1 = "uri1";
374388
final String uri2 = "uri2";
375-
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult);
389+
when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryables")).thenReturn(queryResult);
376390
when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2));
377391
when(resultEntry1.getSummary()).thenReturn(summary);
378392
when(resultEntry2.getSummary()).thenReturn(summary);

0 commit comments

Comments
 (0)