/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.db.impl.query; import org.simantics.db.exception.DatabaseException; import org.simantics.db.impl.graph.ReadGraphImpl; import org.simantics.db.impl.procedure.InternalProcedure; import org.simantics.db.procedure.ListenerBase; import gnu.trove.procedure.TIntProcedure; final public class SuperTypes extends UnaryQuery> { SuperTypes(final int resource) { super(resource); } // final public static SuperTypes queryEach(ReadGraphImpl graph, final int r, final QueryProcessor provider, final CacheEntry parent, final ListenerBase listener, final InternalProcedure procedure) throws DatabaseException { // return QueryCache.runnerSuperTypes(graph, r, parent, listener, procedure); // } @Override final public void removeEntry(QueryProcessor provider) { provider.cache.remove(this); } //@Override public Object compute(ReadGraphImpl graph, final InternalProcedure procedure) throws DatabaseException { return computeForEach(graph, id, this, procedure); } private static void addOrSet(ReadGraphImpl graph, SuperTypes entry, IntSet value) { if(entry != null) { entry.addOrSet(graph, value, graph.processor); } } public static Object computeForEach(ReadGraphImpl graph, int r, SuperTypes entry, final InternalProcedure procedure) throws DatabaseException { QueryProcessor provider = graph.processor; final int inherits = provider.getInherits(); final IntSet result = new IntSet(provider.querySupport); final TIntProcedure addToResult = new TIntProcedure() { @Override public boolean execute(int r) { synchronized(result) { result.add(r); } return true; } }; QueryCache.runnerDirectObjects(graph, r, inherits, entry, null, new SyncIntProcedure() { @Override public void run(ReadGraphImpl graph) throws DatabaseException { addOrSet(graph, entry, result); procedure.execute(graph, result); } @Override public void execute(ReadGraphImpl graph, final int i) throws DatabaseException { // assert(graph.parent == parent); synchronized(result) { result.add(i); } inc(); QueryCache.runnerSuperTypes(graph, i, entry, null, new InternalProcedure() { @Override public void execute(ReadGraphImpl graph, IntSet types) throws DatabaseException { types.forEach(addToResult); dec(graph); } @Override public void exception(ReadGraphImpl graph, Throwable t) throws DatabaseException { procedure.exception(graph, t); } }); } @Override public void finished(ReadGraphImpl graph) throws DatabaseException { dec(graph); } }); return result; } @Override public String toString() { return "SuperTypes2[" + id + "]"; } private void addOrSet(ReadGraphImpl graph, final IntSet value, QueryProcessor provider) { assert(!isReady()); synchronized(this) { value.trim(); setResult(value); setReady(); } } @Override public Object performFromCache(ReadGraphImpl graph, InternalProcedure procedure) throws DatabaseException { assert(isReady()); if(handleException(graph, procedure)) return null; IntSet result = getResult(); procedure.execute(graph, result); return result; } @Override public void recompute(ReadGraphImpl graph) throws DatabaseException { compute(graph, new InternalProcedure() { @Override public void execute(ReadGraphImpl graph, IntSet result) { } @Override public void exception(ReadGraphImpl graph, Throwable t) { new Error("Error in recompute.", t).printStackTrace(); } }); } @Override boolean isImmutable(ReadGraphImpl graph) { return graph.processor.isImmutable(id); } }