package edu.washington.escience.myria.operator; import java.util.Iterator; import java.util.Objects; import edu.washington.escience.myria.DbException; import edu.washington.escience.myria.Schema; import edu.washington.escience.myria.coordinator.CatalogException; import edu.washington.escience.myria.coordinator.MasterCatalog; import edu.washington.escience.myria.storage.TupleBatch; /** * Operator to get the result of a query on the catalog. The catalog is a SQLite database. */ public class CatalogQueryScan extends LeafOperator { /** * Iterate over data from the catalog. */ private transient Iterator<TupleBatch> tuples; /** * The result schema. * */ private final Schema outputSchema; /** * The SQL query. */ private final String sql; /** * The master catalog. */ private final transient MasterCatalog catalog; /** Required for Java serialization. */ private static final long serialVersionUID = 1L; /** The logger for debug, trace, etc. messages in this class. */ private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(CatalogQueryScan.class); /** * Constructor. * * @param sql see the corresponding field. * @param outputSchema see the corresponding field. * @param catalog see the corresponding field. * */ public CatalogQueryScan( final String sql, final Schema outputSchema, final MasterCatalog catalog) { this.sql = Objects.requireNonNull(sql); ; this.outputSchema = Objects.requireNonNull(outputSchema); this.catalog = Objects.requireNonNull(catalog); } @Override public final void cleanup() { tuples = null; } @Override protected final TupleBatch fetchNextReady() throws DbException { if (tuples == null) { try { tuples = catalog.tupleBatchIteratorFromQuery(sql, outputSchema); } catch (CatalogException e) { throw new DbException(e); } } if (tuples.hasNext()) { final TupleBatch tb = tuples.next(); LOGGER.trace("Got {} tuples", tb.numTuples()); return tb; } else { return null; } } @Override public final Schema generateSchema() { return outputSchema; } }