Skip to content

Commit de41b7d

Browse files
committed
#3664 Stop using JsonObject on StructuredData - share variable names and logic for the Sarql queries
1 parent 921d769 commit de41b7d

File tree

4 files changed

+33
-68
lines changed

4 files changed

+33
-68
lines changed

app/src/main/java/fr/free/nrw/commons/depictions/subClass/models/SparqlResponses.kt

+9-33
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,25 @@ package fr.free.nrw.commons.depictions.subClass.models
22

33
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
44

5-
6-
data class ParentSparqlResponse(val results: ParentResult) {
7-
fun toDepictedItems() =
8-
results.bindings
9-
.filter { it.parentClassDescription != null }
10-
.map {
11-
DepictedItem(
12-
it.parentClassLabel.value,
13-
it.parentClassDescription!!.value,
14-
"",
15-
false,
16-
it.parentClass.value
17-
)
18-
}
19-
}
20-
21-
data class SubclassSparqlResponse(val results: SubclassResult) {
5+
data class SparqlResponse(val results: Result) {
226
fun toDepictedItems() =
237
results.bindings.map {
248
DepictedItem(
25-
it.subclassLabel.value,
26-
it.subclassDescription?.value ?: "",
9+
it.itemLabel.value,
10+
it.itemDescription?.value ?: "",
2711
"",
2812
false,
29-
it.subclass.value.substringAfterLast("/")
13+
it.item.value.substringAfterLast("/")
3014
)
3115
}
3216
}
3317

34-
data class ParentResult(val bindings: List<ParentBinding>)
35-
36-
data class SubclassResult(val bindings: List<SubclassBinding>)
37-
38-
data class ParentBinding(
39-
val parentClass: SparqInfo,
40-
val parentClassLabel: SparqInfo,
41-
val parentClassDescription: SparqInfo? = null
42-
)
18+
data class Result(val bindings: List<Binding>)
4319

44-
data class SubclassBinding(
45-
val subclass: SparqInfo,
46-
val subclassLabel: SparqInfo,
47-
val subclassDescription: SparqInfo? = null
20+
data class Binding(
21+
val item: SparqInfo,
22+
val itemLabel: SparqInfo,
23+
val itemDescription: SparqInfo? = null
4824
)
4925

5026
data class SparqInfo(val type: String, val value: String)

app/src/main/java/fr/free/nrw/commons/mwapi/OkHttpJsonApiClient.java

+20-31
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
import fr.free.nrw.commons.achievements.FeaturedImages;
77
import fr.free.nrw.commons.achievements.FeedbackResponse;
88
import fr.free.nrw.commons.campaigns.CampaignResponseDTO;
9-
import fr.free.nrw.commons.depictions.subClass.models.ParentSparqlResponse;
10-
import fr.free.nrw.commons.depictions.subClass.models.SubclassSparqlResponse;
9+
import fr.free.nrw.commons.depictions.subClass.models.SparqlResponse;
1110
import fr.free.nrw.commons.location.LatLng;
1211
import fr.free.nrw.commons.nearby.Place;
1312
import fr.free.nrw.commons.nearby.model.NearbyResponse;
@@ -29,6 +28,7 @@
2928
import okhttp3.Request;
3029
import okhttp3.Response;
3130
import okhttp3.ResponseBody;
31+
import org.jetbrains.annotations.NotNull;
3232
import timber.log.Timber;
3333

3434
/**
@@ -207,51 +207,40 @@ public Observable<List<Place>> getNearbyPlaces(LatLng cur, String language, doub
207207
* bridge -> suspended bridge, aqueduct, etc
208208
*/
209209
public Observable<List<DepictedItem>> getChildQIDs(String qid) throws IOException {
210-
String queryString = FileUtils.readFromResource("/queries/subclasses_query.rq");
211-
String query = queryString.
212-
replace("${QID}", qid)
213-
.replace("${LANG}", "\"" + Locale.getDefault().getLanguage() + "\"");
214-
Timber.e(query);
215-
HttpUrl.Builder urlBuilder = HttpUrl
216-
.parse(sparqlQueryUrl)
217-
.newBuilder()
218-
.addQueryParameter("query", query)
219-
.addQueryParameter("format", "json");
220-
Request request = new Request.Builder()
221-
.url(urlBuilder.build())
222-
.build();
223-
return Observable.fromCallable(() -> {
224-
Response response = okHttpClient.newCall(request).execute();
225-
return gson.fromJson(response.body().string(), SubclassSparqlResponse.class).toDepictedItems();
226-
}).doOnError(Timber::e);
210+
return depictedItemsFrom(sparqlQuery(qid, "/queries/subclasses_query.rq"));
227211
}
228212

229213
/**
230214
* Get the QIDs of all Wikidata items that are subclasses of the given Wikidata item. Example:
231215
* bridge -> suspended bridge, aqueduct, etc
232216
*/
233217
public Observable<List<DepictedItem>> getParentQIDs(String qid) throws IOException {
234-
String queryString = FileUtils.readFromResource("/queries/parentclasses_query.rq");
235-
String query = queryString.
218+
return depictedItemsFrom(sparqlQuery(qid, "/queries/parentclasses_query.rq"));
219+
}
220+
221+
private Observable<List<DepictedItem>> depictedItemsFrom(Request request) {
222+
return Observable.fromCallable(() -> {
223+
try (ResponseBody body = okHttpClient.newCall(request).execute().body()) {
224+
return gson.fromJson(body.string(), SparqlResponse.class).toDepictedItems();
225+
}catch (Exception e) {
226+
return new ArrayList<DepictedItem>();
227+
}
228+
}).doOnError(Timber::e);
229+
}
230+
231+
@NotNull
232+
private Request sparqlQuery(String qid, String fileName) throws IOException {
233+
String query = FileUtils.readFromResource(fileName).
236234
replace("${QID}", qid)
237235
.replace("${LANG}", "\"" + Locale.getDefault().getLanguage() + "\"");
238-
Timber.e(query);
239236
HttpUrl.Builder urlBuilder = HttpUrl
240237
.parse(sparqlQueryUrl)
241238
.newBuilder()
242239
.addQueryParameter("query", query)
243240
.addQueryParameter("format", "json");
244-
Request request = new Request.Builder()
241+
return new Request.Builder()
245242
.url(urlBuilder.build())
246243
.build();
247-
return Observable.fromCallable(() -> {
248-
Response response = okHttpClient.newCall(request).execute();
249-
try {
250-
return gson.fromJson(response.body().string(), ParentSparqlResponse.class).toDepictedItems();
251-
} catch (Exception e) {
252-
return new ArrayList<DepictedItem>();
253-
}
254-
}).doOnError(Timber::e);
255244
}
256245

257246
public Single<CampaignResponseDTO> getCampaigns() {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SELECT ?parentClass ?parentClassLabel ?parentClassDescription WHERE {
2-
wd:${QID} wdt:P279 ?parentClass.
1+
SELECT ?item ?itemLabel ?itemDescription WHERE {
2+
wd:${QID} wdt:P279 ?item.
33
SERVICE wikibase:label { bd:serviceParam wikibase:language ${LANG}. }
44
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
SELECT ?subclass ?subclassLabel ?subclassDescription WHERE {
2-
?subclass wdt:P279 wd:${QID}.
1+
SELECT ?item ?itemLabel ?itemDescription WHERE {
2+
?item wdt:P279 wd:${QID}.
33
SERVICE wikibase:label { bd:serviceParam wikibase:language ${LANG}. }
44
}

0 commit comments

Comments
 (0)