Loading...
Searching...
No Matches
VirtualTaQLColumn.h
Go to the documentation of this file.
//# VirtualTaQLColumn.h: Virtual column engine based on TaQL
//# Copyright (C) 2005
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: casa-feedback@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
#ifndef TABLES_VIRTUALTAQLCOLUMN_H
#define TABLES_VIRTUALTAQLCOLUMN_H
//# Includes
#include <casacore/casa/aips.h>
#include <casacore/tables/DataMan/VirtColEng.h>
#include <casacore/tables/DataMan/DataManager.h>
#include <casacore/casa/Arrays/IPosition.h>
namespace casacore {
//# Forward Declarations
class TableExprNode;
// <category lib=aips module="Tables" sect="Virtual Columns">
// <summary> Virtual scalar column using TaQL</summary>
// <reviewed reviewer="GvD" date="2004/07/09" tests="">
//
// <prerequisite>
//# Classes you should understand before using this one.
// <li> VirtualScalarColumn
// </prerequisite>
//
// <synopsis>
// VirtualTaQLColumn is a virtual column engine to define the contents of a
// column as a TaQL CALC expression in which possibly other columns are used.
// It is (of course) only possible to get data from the column; puts cannot
// be done. See note 199 for a description of TaQL.
// The TaQL style can be specified (such as 0- or 1-based indexing).
// <br>
// The expression result can be a scalar or array of the basic TaQL data types.
// The column data type has to be conformant with that TaQL type, thus a
// column of any integer type has to be used for an integer TaQL result.
// <br>
// Constant expressions are precalculated and cached making the retrieval of
// e.g. the full column much faster (factor 4).
// <br>
// A possible use for a virtual TaQL column is a column in a MeasurementSet
// containing a constant value. It could also be used for on-the-fly calculation
// of J2000 UVW-values or HADEC using an expression such as "derivedmscal.newuvw()"
// <note role=caution> One has to be careful with deleting columns. If in an
// existing table a TaQL expression uses a deleted column, the expression
// cannot be parsed anymore and the table cannot be opened anymore.
// In the future the Table System will be made more forgiving.
// </note>
// </synopsis>
//
// <example>
// The following example creates a table with a few columns.
// One column is virtual and has a random value if Col3 is true.
// Otherwise it has value 0.
// <srcblock>
// // Create the table description.
// TableDesc td;
// td.addColumn (ScalarColumnDesc<DComplex>("Col1"));
// td.addColumn (ScalarColumnDesc<Int>("Col2"));
// td.addColumn (ScalarColumnDesc<Bool>("Col3"));
// td.addColumn (ScalarColumnDesc<Double>("ColVirt"));
//
// // Now create a new table from the description.
// SetupNewTable newTab("tmtest", td, Table::New);
// // Define the expression of the virtual column and bind the column to it.
// // The other columns are by default bound to StandardStMan.
// VirtualTaQLColumn engine("iif(Col3,rand(),0)");
// newTab.bindColumn("ColVirt", engine);
// Table tab(newTab);
// </srcblock>
// </example>
class VirtualTaQLColumn : public VirtualColumnEngine, public DataManagerColumn
{
public:
// Construct it with the given TaQL expression.
VirtualTaQLColumn (const String& expr, const String& style=String());
// Construct it with the given specification.
VirtualTaQLColumn (const Record& spec);
// Destructor is mandatory.
virtual ~VirtualTaQLColumn();
// Copy is not needed and therefore forbidden.
VirtualTaQLColumn (const VirtualTaQLColumn&) = delete;
// Assignment is not needed and therefore forbidden.
VirtualTaQLColumn& operator= (const VirtualTaQLColumn&) = delete;
// Clone the engine object.
virtual DataManager* clone() const;
// Get the data manager specification.
virtual Record dataManagerSpec() const;
// Return the type name of the engine.
// (i.e. its class name VirtualTaQLColumn).
virtual String dataManagerType() const;
// Return the name of the class.
static String className();
// Register the class name and the static makeObject "constructor".
// This will make the engine known to the table system.
static void registerClass();
// Define the "constructor" to construct this engine when a
// table is read back.
// This "constructor" has to be registered by the user of the engine.
// If the engine is commonly used, its registration can be added
// into the registerAllCtor function in DataManReg.cc.
// This function gets automatically invoked by the table system.
static DataManager* makeObject (const String& dataManagerName,
const Record& spec);
// Return the TaQL expression used.
const String& expression() const
{ return itsExpr; }
// Set the shape of an array in the column.
// It is only called (right after the constructor) if the array has
// a fixed shape.
virtual void setShapeColumn (const IPosition& aShape);
// Set the maximum length of a 'fixed length' string.
// It is only called (right after the constructor) if the string has
// a fixed length.
virtual void setMaxLength (uInt maxLength);
// Functions to return column info.
// <group>
virtual int dataType() const;
virtual Bool isWritable() const;
virtual uInt ndim (rownr_t rownr);
virtual IPosition shape (rownr_t rownr);
virtual Bool isShapeDefined (rownr_t rownr);
// </group>
private:
// Create the column object for the scalar column in this engine.
virtual DataManagerColumn* makeScalarColumn (const String& columnName,
int dataType, const String&);
// Create the column object for the indirect array column in this engine.
virtual DataManagerColumn* makeIndArrColumn (const String& columnName,
int dataType,
const String& dataTypeId);
// Let the engine initialize the object for a new table.
// It defines a column keyword holding the expression.
virtual void create64 (rownr_t);
// Prepare compiles the expression.
virtual void prepare();
// Get the scalar value in the given row.
// <group>
virtual void getBool (rownr_t rownr, Bool* dataPtr);
virtual void getuChar (rownr_t rownr, uChar* dataPtr);
virtual void getShort (rownr_t rownr, Short* dataPtr);
virtual void getuShort (rownr_t rownr, uShort* dataPtr);
virtual void getInt (rownr_t rownr, Int* dataPtr);
virtual void getuInt (rownr_t rownr, uInt* dataPtr);
virtual void getInt64 (rownr_t rownr, Int64* dataPtr);
virtual void getfloat (rownr_t rownr, float* dataPtr);
virtual void getdouble (rownr_t rownr, double* dataPtr);
virtual void getComplex (rownr_t rownr, Complex* dataPtr);
virtual void getDComplex (rownr_t rownr, DComplex* dataPtr);
virtual void getString (rownr_t rownr, String* dataPtr);
// </group>
// Get the array value in the given row.
// The array given by <src>arr</src> has to have the correct shape
// (which is guaranteed by the ArrayColumn get function).
virtual void getArrayV (rownr_t rownr, ArrayBase& arr);
// Get the array result into itsCurArray.
void getResult (rownr_t rownr);
// Make the result cache.
void makeCurArray();
// Get functions implemented by means of their DataManagerColumn::getXXBase
// counterparts, but optimized for constant expressions.
// <group>
virtual void getScalarColumnV (ArrayBase& arr);
virtual void getScalarColumnCellsV (const RefRows& rownrs,
ArrayBase& arr);
// </group>
// Fill the ColumnCache object with a constant scalar value.
void fillColumnCache();
// Fill an array with a constant scalar value.
void fillArray (ArrayBase& data);
//# Now define the data members.
int itsDataType;
Bool itsIsArray;
Bool itsIsConst; //# Constant expression?
Bool itsTempWritable;
String itsColumnName;
String itsExpr; //# TaQL expression
String itsStyle; //# TaQL style
TableExprNode* itsNode; //# compiled TaQL expression
IPosition itsShape; //# The shape of the column.
uInt itsMaxLen; //# The maximum length of a 'fixed length' string.
union {
Bool itsBool; //# Constant scalar values
uChar itsuChar;
Short itsShort;
uShort itsuShort;
Int itsInt;
uInt itsuInt;
Int64 itsInt64;
Float itsFloat;
Double itsDouble;
};
Complex itsComplex;
DComplex itsDComplex;
String itsString;
ArrayBase* itsCurArray; //# array value (constant or in itsCurRow)
rownr_t itsCurRow; //# row of current array value
};
} //end namespace casacore
#endif
casacore::ArrayBase
Non-templated base class for templated Array class.
Definition ArrayBase.h:71
casacore::DataManagerColumn::DataManagerColumn
DataManagerColumn()
Create a column.
Definition DataManagerColumn.h:153
casacore::DataManagerColumn::columnName
const String & columnName() const
Get rhe column name.
Definition DataManagerColumn.h:429
casacore::DataManagerColumn::dataTypeId
virtual String dataTypeId() const
Get the data type id of the column for dataType==TpOther.
casacore::DataManager
Abstract base class for a data manager.
Definition DataManager.h:219
casacore::DataManager::dataManagerName
virtual String dataManagerName() const
Return the name of the data manager.
casacore::IPosition
Definition IPosition.h:117
casacore::RefRows
Definition RefRows.h:84
casacore::String
String: the storage and methods of handling collections of characters.
Definition String.h:223
casacore::TableExprNode
Definition ExprNode.h:154
casacore::VirtualColumnEngine::VirtualColumnEngine
VirtualColumnEngine()
Create the object.
Definition VirtColEng.h:114
casacore::VirtualTaQLColumn::getuInt
virtual void getuInt(rownr_t rownr, uInt *dataPtr)
casacore::VirtualTaQLColumn::getScalarColumnV
virtual void getScalarColumnV(ArrayBase &arr)
Get functions implemented by means of their DataManagerColumn::getXXBase counterparts,...
casacore::VirtualTaQLColumn::itsIsConst
Bool itsIsConst
Definition VirtualTaQLColumn.h:224
casacore::VirtualTaQLColumn::itsInt64
Int64 itsInt64
Definition VirtualTaQLColumn.h:239
casacore::VirtualTaQLColumn::itsIsArray
Bool itsIsArray
Definition VirtualTaQLColumn.h:223
casacore::VirtualTaQLColumn::getInt64
virtual void getInt64(rownr_t rownr, Int64 *dataPtr)
casacore::VirtualTaQLColumn::getuChar
virtual void getuChar(rownr_t rownr, uChar *dataPtr)
casacore::VirtualTaQLColumn::makeCurArray
void makeCurArray()
Make the result cache.
casacore::VirtualTaQLColumn::makeObject
static DataManager * makeObject(const String &dataManagerName, const Record &spec)
Define the "constructor" to construct this engine when a table is read back.
casacore::VirtualTaQLColumn::itsExpr
String itsExpr
Definition VirtualTaQLColumn.h:227
casacore::VirtualTaQLColumn::isShapeDefined
virtual Bool isShapeDefined(rownr_t rownr)
Is the value shape defined in the given row?
casacore::VirtualTaQLColumn::~VirtualTaQLColumn
virtual ~VirtualTaQLColumn()
Destructor is mandatory.
casacore::VirtualTaQLColumn::itsCurArray
ArrayBase * itsCurArray
Definition VirtualTaQLColumn.h:246
casacore::VirtualTaQLColumn::itsShort
Short itsShort
Definition VirtualTaQLColumn.h:235
casacore::VirtualTaQLColumn::clone
virtual DataManager * clone() const
Clone the engine object.
casacore::VirtualTaQLColumn::itsShape
IPosition itsShape
Definition VirtualTaQLColumn.h:230
casacore::VirtualTaQLColumn::getBool
virtual void getBool(rownr_t rownr, Bool *dataPtr)
Get the scalar value in the given row.
casacore::VirtualTaQLColumn::getfloat
virtual void getfloat(rownr_t rownr, float *dataPtr)
casacore::VirtualTaQLColumn::getShort
virtual void getShort(rownr_t rownr, Short *dataPtr)
casacore::VirtualTaQLColumn::itsDataType
int itsDataType
Definition VirtualTaQLColumn.h:222
casacore::VirtualTaQLColumn::create64
virtual void create64(rownr_t)
Let the engine initialize the object for a new table.
casacore::VirtualTaQLColumn::getString
virtual void getString(rownr_t rownr, String *dataPtr)
casacore::VirtualTaQLColumn::ndim
virtual uInt ndim(rownr_t rownr)
Get the dimensionality of the item in the given row.
casacore::VirtualTaQLColumn::registerClass
static void registerClass()
Register the class name and the static makeObject "constructor".
casacore::VirtualTaQLColumn::getResult
void getResult(rownr_t rownr)
Get the array result into itsCurArray.
casacore::VirtualTaQLColumn::shape
virtual IPosition shape(rownr_t rownr)
Get the shape of the item in the given row.
casacore::VirtualTaQLColumn::getInt
virtual void getInt(rownr_t rownr, Int *dataPtr)
casacore::VirtualTaQLColumn::itsNode
TableExprNode * itsNode
Definition VirtualTaQLColumn.h:229
casacore::VirtualTaQLColumn::itsuShort
uShort itsuShort
Definition VirtualTaQLColumn.h:236
casacore::VirtualTaQLColumn::fillArray
void fillArray(ArrayBase &data)
Fill an array with a constant scalar value.
casacore::VirtualTaQLColumn::VirtualTaQLColumn
VirtualTaQLColumn(const Record &spec)
Construct it with the given specification.
casacore::VirtualTaQLColumn::getdouble
virtual void getdouble(rownr_t rownr, double *dataPtr)
casacore::VirtualTaQLColumn::prepare
virtual void prepare()
Prepare compiles the expression.
casacore::VirtualTaQLColumn::itsColumnName
String itsColumnName
Definition VirtualTaQLColumn.h:226
casacore::VirtualTaQLColumn::getuShort
virtual void getuShort(rownr_t rownr, uShort *dataPtr)
casacore::VirtualTaQLColumn::itsString
String itsString
Definition VirtualTaQLColumn.h:245
casacore::VirtualTaQLColumn::className
static String className()
Return the name of the class.
casacore::VirtualTaQLColumn::fillColumnCache
void fillColumnCache()
Fill the ColumnCache object with a constant scalar value.
casacore::VirtualTaQLColumn::expression
const String & expression() const
Return the TaQL expression used.
Definition VirtualTaQLColumn.h:141
casacore::VirtualTaQLColumn::itsComplex
Complex itsComplex
Definition VirtualTaQLColumn.h:243
casacore::VirtualTaQLColumn::itsMaxLen
uInt itsMaxLen
Definition VirtualTaQLColumn.h:231
casacore::VirtualTaQLColumn::dataManagerType
virtual String dataManagerType() const
Return the type name of the engine.
casacore::VirtualTaQLColumn::itsDComplex
DComplex itsDComplex
Definition VirtualTaQLColumn.h:244
casacore::VirtualTaQLColumn::operator=
VirtualTaQLColumn & operator=(const VirtualTaQLColumn &)=delete
Assignment is not needed and therefore forbidden.
casacore::VirtualTaQLColumn::itsuInt
uInt itsuInt
Definition VirtualTaQLColumn.h:238
casacore::VirtualTaQLColumn::itsFloat
Float itsFloat
Definition VirtualTaQLColumn.h:240
casacore::VirtualTaQLColumn::itsBool
Bool itsBool
Definition VirtualTaQLColumn.h:233
casacore::VirtualTaQLColumn::getDComplex
virtual void getDComplex(rownr_t rownr, DComplex *dataPtr)
casacore::VirtualTaQLColumn::isWritable
virtual Bool isWritable() const
Test if data can be put into this column.
casacore::VirtualTaQLColumn::itsInt
Int itsInt
Definition VirtualTaQLColumn.h:237
casacore::VirtualTaQLColumn::itsTempWritable
Bool itsTempWritable
Definition VirtualTaQLColumn.h:225
casacore::VirtualTaQLColumn::itsuChar
uChar itsuChar
Definition VirtualTaQLColumn.h:234
casacore::VirtualTaQLColumn::getComplex
virtual void getComplex(rownr_t rownr, Complex *dataPtr)
casacore::VirtualTaQLColumn::makeIndArrColumn
virtual DataManagerColumn * makeIndArrColumn(const String &columnName, int dataType, const String &dataTypeId)
Create the column object for the indirect array column in this engine.
casacore::VirtualTaQLColumn::VirtualTaQLColumn
VirtualTaQLColumn(const String &expr, const String &style=String())
Construct it with the given TaQL expression.
casacore::VirtualTaQLColumn::VirtualTaQLColumn
VirtualTaQLColumn(const VirtualTaQLColumn &)=delete
Copy is not needed and therefore forbidden.
casacore::VirtualTaQLColumn::setMaxLength
virtual void setMaxLength(uInt maxLength)
Set the maximum length of a 'fixed length' string.
casacore::VirtualTaQLColumn::getScalarColumnCellsV
virtual void getScalarColumnCellsV(const RefRows &rownrs, ArrayBase &arr)
Get some scalar values in the column.
casacore::VirtualTaQLColumn::setShapeColumn
virtual void setShapeColumn(const IPosition &aShape)
Set the shape of an array in the column.
casacore::VirtualTaQLColumn::dataManagerSpec
virtual Record dataManagerSpec() const
Get the data manager specification.
casacore::VirtualTaQLColumn::itsCurRow
rownr_t itsCurRow
Definition VirtualTaQLColumn.h:247
casacore::VirtualTaQLColumn::getArrayV
virtual void getArrayV(rownr_t rownr, ArrayBase &arr)
Get the array value in the given row.
casacore::VirtualTaQLColumn::itsStyle
String itsStyle
Definition VirtualTaQLColumn.h:228
casacore::VirtualTaQLColumn::dataType
virtual int dataType() const
Functions to return column info.
casacore::VirtualTaQLColumn::itsDouble
Double itsDouble
Definition VirtualTaQLColumn.h:241
casacore::VirtualTaQLColumn::makeScalarColumn
virtual DataManagerColumn * makeScalarColumn(const String &columnName, int dataType, const String &)
Create the column object for the scalar column in this engine.
casacore::Record
Record()
casacore
this file contains all the compiler specific defines
Definition mainpage.dox:28
casacore::uChar
unsigned char uChar
Definition aipstype.h:45
casacore::Short
short Short
Definition aipstype.h:46
casacore::uInt
unsigned int uInt
Definition aipstype.h:49
casacore::uShort
unsigned short uShort
Definition aipstype.h:47
casacore::Int64
long long Int64
Define the extra non-standard types used by Casacore (like proposed uSize, Size).
Definition aipsxtype.h:36
casacore::Float
float Float
Definition aipstype.h:52
casacore::Int
int Int
Definition aipstype.h:48
casacore::Bool
bool Bool
Define the standard types used by Casacore.
Definition aipstype.h:40
casacore::Double
double Double
Definition aipstype.h:53
casacore::rownr_t
uInt64 rownr_t
Define the type of a row number in a table.
Definition aipsxtype.h:44