Reputation: 2558
NOTE : i have seen the JOIN in GAE related posts but GROUP BY in my requirements made me make a new post and I have made a solution of my own which I wanted to check how good is it
Datastore Entities properties and types (database)
Entity : PartyEntity lets call this as a
Entity : InsertEntity lets call this as b
Objective
SELECT * FROM a JOIN b on a.partyId = b.partyIdentifier GROUP BY b.constituency;
below I shall answer my question , THE CODE WORKS FINE DO ADVICE ME ANY CHANGES OR BETTER WAYS (I am just a student)
Upvotes: 0
Views: 586
Reputation: 2558
The solution I made is as follows , do advice any changes or better ways
// SELECT * FROM a (PartyEntity holds unique partyId) and for each partyId SELECT * FROM b
private List<ListDisplay> initData() {
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
List<ListDisplay> data = new ArrayList<ListDisplay>();
Query query = new Query("PartyEntity");
PreparedQuery preparedQuery = datastore.prepare(query);
List<Entity> entities = preparedQuery.asList(FetchOptions.Builder
.withDefaults());
for (Entity entity : entities) {
String PARTY_ID = (String) entity.getProperty("partyId");
// fetch from another
Query query2 = new Query("InsertEntity");
Filter filterByPartyId = new Query.FilterPredicate(
"partyIdentifier", FilterOperator.EQUAL, PARTY_ID);
query2.setFilter(filterByPartyId);
PreparedQuery preparedQuery2 = datastore.prepare(query2);
List<Entity> entities2 = preparedQuery2.asList(FetchOptions.Builder
.withDefaults());
for (Entity entity2 : entities2) {
ListDisplay display = new ListDisplay();
display.setPartyId((String) entity.getProperty("partyId"));
display.setPartyName((String) entity.getProperty("partyName"));
display.setImage((BlobKey) entity.getProperty("image"));
display.setName((String) entity2.getProperty("name"));
display.setConstituency((String) entity2
.getProperty("constituency"));
data.add(display);
} // end loop entity2
} // end loop entity
return data;
}
// GROUP BY constituency clause part
public HashMap<String, List<ListDisplay>> getData() {
HashMap<String, List<ListDisplay>> data = new HashMap<>();
List<ListDisplay> list = initData();
for (ListDisplay d : list) {
// if null add
if (data.get(d.getConstituency()) == null) {
List<ListDisplay> internal = new ArrayList<>();
internal.add(d);
data.put(d.getConstituency(), internal);
}
// else modify
else {
List<ListDisplay> hashlist = data.get(d.getConstituency());
hashlist.add(d);
data.remove(d.getConstituency());
data.put(d.getConstituency(), hashlist);
}
}
return data;
}
Upvotes: 1