package org.commcare.engine.cases; import org.commcare.cases.ledger.Ledger; import org.commcare.cases.instance.LedgerInstanceTreeElement; import org.commcare.cases.query.PredicateProfile; import org.commcare.cases.query.QueryContext; import org.commcare.cases.util.QueryUtils; import org.commcare.cases.query.handlers.StaticLookupQueryHandler; import org.commcare.models.database.SqlStorage; import org.commcare.models.database.SqlStorageIterator; import org.commcare.android.database.user.models.ACase; import org.javarosa.core.model.condition.EvaluationContext; import org.javarosa.core.model.instance.AbstractTreeElement; import org.javarosa.core.services.storage.IStorageIterator; import org.javarosa.core.util.DataUtil; import org.javarosa.xpath.expr.XPathExpression; import java.util.Collection; import java.util.Hashtable; import java.util.Vector; /** * @author ctsims */ public class AndroidLedgerInstanceTreeElement extends LedgerInstanceTreeElement { private Hashtable<String, Integer> primaryIdMapping; public AndroidLedgerInstanceTreeElement(AbstractTreeElement instanceRoot, SqlStorage<Ledger> storage) { super(instanceRoot, storage); primaryIdMapping = null; addStaticQueryHandler(); } private void addStaticQueryHandler() { this.getQueryPlanner().addQueryHandler(new StaticLookupQueryHandler() { @Override public Collection<PredicateProfile> collectPredicateProfiles(Vector<XPathExpression> predicates, QueryContext context, EvaluationContext evaluationContext) { return null; } @Override protected boolean canHandle(String attributeName) { return attributeName.equals(Ledger.INDEX_ENTITY_ID) && primaryIdMapping != null; } @Override protected Vector<Integer> getMatches(String attributeName, String valueToMatch) { return QueryUtils.wrapSingleResult(primaryIdMapping.get(valueToMatch)); } }); } @Override protected synchronized void loadElements() { if (elements != null) { return; } elements = new Vector<>(); primaryIdMapping = new Hashtable<>(); int mult = 0; for (IStorageIterator i = ((SqlStorage<ACase>)getStorage()).iterate(false, Ledger.INDEX_ENTITY_ID); i.hasMore(); ) { int id = i.peekID(); elements.addElement(buildElement(this, id, null, mult)); objectIdMapping.put(DataUtil.integer(id), DataUtil.integer(mult)); primaryIdMapping.put(((SqlStorageIterator)i).getPrimaryId(), DataUtil.integer(id)); mult++; i.nextID(); } } }