Srinath Ganesh
Srinath Ganesh

Reputation: 2558

GAE datastore JOIN + GROUP BY

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)

  1. Entity : PartyEntity lets call this as a

    • String partyName
    • String partyId
    • BlobKey image
  2. Entity : InsertEntity lets call this as b

    • String partyIdentifier
    • String name
    • String constituency

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

Answers (1)

Srinath Ganesh
Srinath Ganesh

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

Related Questions