All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.ac.starlink.table.StarTable Maven / Gradle / Ivy

package uk.ac.starlink.table;

import java.io.Closeable;
import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.List;

/**
 * Defines basic table functionality.
 * A table has a fixed number of columns, and a sequence of rows, each of
 * which has one entry for each column.
 * The entry in each column is of the same type (or at least a subtype
 * of a given type) for each row; this type can be determined using
 * the {@link ColumnInfo} objects returned by {@link #getColumnInfo}.
 * The first row and the first column are numbered 0.
 *
 * 

All StarTables allow sequential access, provided by * calling {@link #getRowSequence}. This may in general be * called multiple times so that more than one iteration can be made * through the rows of the table from start to finish. * The {@link #getRowSplittable} method supports multi-threaded * sequential access, and is used by {@link RowRunner}. * Additionally, if the {@link #isRandom} method returns true * then the random access methods {@link #getRowAccess}, * {@link #getRow} and {@link #getCell} * may be used to access table contents directly. * *

For random tables, the getRow and getCell methods * should be thread-safe. Separate RowSequence * and RowAccess objects obtained * from the same table should be safely usable from different threads, * but a given RowSequence/RowAccess in general will not. * *

In general it is preferred to use {@link #getRowAccess} than * the equivalent getRow/getCell methods * of the table itself, since the assumption of single-threaded use * may permit more efficient implementation. * * @author Mark Taylor (Starlink) */ public interface StarTable extends Closeable { /** * Returns the number of columns in this table. * * @return the number of columns */ int getColumnCount(); /** * Returns the number of rows in this table, if known. If the number * of rows cannot be (easily) determined, a value of -1 will be returned. * * @return the number of rows, or -1 */ long getRowCount(); /** * Returns the URL of this table, if it has one. A non-null return * from this method indicates that this table is in some sense persistent. * * @return the URL of this table, or null if none is known */ URL getURL(); /** * Sets the URL of this table. It ought to be possible in principle * to reconstruct this table by reading the resource at url. * If called, the supplied url should provide the return * value for subsequent calls of {@link #getURL}. * * @param url table URL */ void setURL( URL url ); /** * Returns the name of this table, if it has one. The meaning of * the name is not defined, but it will typically be a short string of * text indicating the identity of this table. * * @return a name for this table, or null if no suitable one * exists */ String getName(); /** * Sets the name of this table. If called, the supplied name * should provide the return value for subsequent calls of * {@link #getName}. * * @param name table name */ void setName( String name ); /** * Returns a list of table parameters, that is metadata items * which pertain to the entire table. * * @return a List of DescribedValue objects * constituting table-wide metadata not covered elsewhere * in this interface */ List getParameters(); /** * Returns a parameter (table-wide metadata item) of this table located * by its name. If more than one parameter with the given name * exists, an arbitrary one will be returned. If no parameter with * the given name exists, null will be returned. * * @param parname the name of the table parameter required */ default DescribedValue getParameterByName( String parname ) { return Tables.getDescribedValueByName( getParameters(), parname ); } /** * Adds the given DescribedValue to the list of parameter metadata objects * associated with this table. If an item in the parameter list with * the same name as the supplied value already exists, it is removed * from the list. * * @param dval the new parameter datum to add */ default void setParameter( DescribedValue dval ) { Tables.setDescribedValue( getParameters(), dval ); } /** * Returns the object describing the data in a given column. * * @param icol the column for which header information is required * @return a ValueInfo object for column icol */ ColumnInfo getColumnInfo( int icol ); /** * Returns an ordered list of ValueInfo objects representing * the auxiliary metadata returned by * getColumnInfo(int).getAuxData() calls. * The idea is that the resulting list can be used to find out * the kind of per-column metadata which can be expected to be found * in some or all columns of this table. Each item in the returned * list should have a unique name, and other characteristics which are * applicable to auxData items which may be returned from any of * the columns in this table. *

* The order of the list may indicate some sort of natural ordering * of these keys. The returned list is not guaranteed to be complete; * it is legal to return an empty list if nothing is known about * auxiliary metadata. The list ought not to contain duplicate elements. * * @return an unmodifiable ordered set of known metadata keys * @see ColumnInfo#getAuxData */ List getColumnAuxDataInfos(); /** * Returns an object which can iterate over all the rows in the table * sequentially. * Each such returned object is safe for use within a single thread, * but not in general from multiple threads concurrently. * * @return new RowSequence * @throws IOException if there is an error providing access */ RowSequence getRowSequence() throws IOException; /** * Returns an object which can provide random access to this * table's data, if random access is implemented. * Each such returned object is safe for use within a single thread, * but not in general from multiple threads concurrently. * * @return new RowAccess * @throws IOException if there is an error setting up access * @throws UnsupportedOperationException if isRandom returns * false */ RowAccess getRowAccess() throws IOException; /** * Returns an object which can iterate over all the rows in the table, * but which may also be requested to split recursively * for potentially parallel processing. * *

The return value must be non-null, and may provide splitting * arrangements specially appropriate for the implementation. * If this table 'wraps' an upstream table, it is usually best to * base the implementation on calls to the the upstream * getRowSplittable method, so that upstream policy * about how to divide up the table is respected. * However, implementations without special requirements may return * {@link Tables#getDefaultRowSplittable * Tables.getDefaultRowSplittable}(this). * * @return new RowSplittable * @see RowRunner */ RowSplittable getRowSplittable() throws IOException; /** * Indicates whether random access is provided by this table. * Only if the result is true may the {@link #getRowAccess}, * {@link #getRow} and {@link #getCell} methods be used. * * @return true if table random access methods are available */ boolean isRandom(); /** * Returns the contents of a given table cell. * The class of the returned object should be the same as, * or a subclass of, the class returned by * getColumnInfo(icol).getContentClass(). * *

This method is safe for concurrent use from multiple threads, * but in general it is recommended to use a * {@link #getRowAccess RowAccess} instead. * * @param irow the index of the cell's row * @param icol the index of the cell's column * @return the contents of this cell * @throws IOException if there is an error reading the data * @throws UnsupportedOperationException if isRandom returns * false */ Object getCell( long irow, int icol ) throws IOException; /** * Returns the contents of a given table row. The returned value is * equivalent to an array formed of all the objects returned by * getCell(irow,icol) for all the columns icol * in sequence. * *

This method is safe for concurrent use from multiple threads, * but in general it is recommended to use a * {@link #getRowAccess RowAccess} instead. * * @param irow the index of the row to retrieve * @return an array of the objects in each cell in row irow * @throws IOException if there is an error reading the data * @throws UnsupportedOperationException if isRandom returns * false */ Object[] getRow( long irow ) throws IOException; /** * Relinquishes any resources associated with this table. * This may do nothing, and calling it is often not required, * but it provides an opportunity to force release of file * descriptors or other resources that are not well handled by * garbage collection if the table itself holds them. * It is not intended for release of heap-based resources, * for which garbage collection already provides adequate management. * *

Following a call to this method, any attempt to use this table * or objects such as RowSequences obtained from it will result * in undefined behaviour. */ public void close() throws IOException; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy