Skip to content
Snippets Groups Projects
Commit 5064f34a authored by Marcel Loose's avatar Marcel Loose :sunglasses:
Browse files

BugID: 1050

A whole bunch of code changes. Most notably:
* All BBSStrategy and all BBSStep classes now inherit from the Command base
  class.
* CommandVisitor is used in quite a number of places to "restore lost type
  information"; i.e. to recover the exact type of a Command.
* CommandQueue now stores and retrieves Commands instead of BBSSteps and
  BBSStrategy.
parent 6dd7007f
No related branches found
No related tags found
No related merge requests found
//# KernelCommandControl.h:
//# CommandExecutor.h:
//#
//# Copyright (C) 2007
//# ASTRON (Netherlands Foundation for Research in Astronomy)
......@@ -20,10 +20,10 @@
//#
//# $Id$
#ifndef LOFAR_BBSCONTROL_KERNELCOMMANDCONTROL_H
#define LOFAR_BBSCONTROL_KERNELCOMMANDCONTROL_H
#ifndef LOFAR_BBSCONTROL_COMMANDEXECUTOR_H
#define LOFAR_BBSCONTROL_COMMANDEXECUTOR_H
#include <BBSControl/CommandHandler.h>
#include <BBSControl/CommandVisitor.h>
#include <BBSControl/BlobStreamableConnection.h>
//#include <BBSControl/BBSStructs.h>
......@@ -45,35 +45,33 @@ class Prediffer;
class RegionOfInterest;
class KernelCommandControl: public CommandHandler
class CommandExecutor: public CommandVisitor
{
public:
KernelCommandControl(shared_ptr<CommandQueue> &queue,
CommandExecutor(shared_ptr<CommandQueue> &queue,
shared_ptr<BlobStreamableConnection> &solver)
: itsCommandQueue(queue),
itsSolverConnection(solver)
{
}
virtual ~KernelCommandControl()
virtual ~CommandExecutor()
{
}
// @name Implementation of handle() for different commands.
// @name Implementation of visit() for different commands.
// @{
virtual void handle(const InitializeCommand &command);
virtual void handle(const FinalizeCommand &command);
virtual void handle(const NextChunkCommand &command);
virtual void handle(const BBSStrategy &command);
virtual void handle(const BBSStep &command);
virtual void handle(const BBSMultiStep &command);
virtual void handle(const BBSSingleStep &command);
virtual void handle(const BBSPredictStep &command);
virtual void handle(const BBSSubtractStep &command);
virtual void handle(const BBSCorrectStep &command);
virtual void handle(const BBSSolveStep &command);
virtual void handle(const BBSShiftStep &command);
virtual void handle(const BBSRefitStep &command);
virtual void visit(const InitializeCommand &command);
virtual void visit(const FinalizeCommand &command);
virtual void visit(const NextChunkCommand &command);
virtual void visit(const BBSStrategy &command);
virtual void visit(const BBSMultiStep &command);
virtual void visit(const BBSPredictStep &command);
virtual void visit(const BBSSubtractStep &command);
virtual void visit(const BBSCorrectStep &command);
virtual void visit(const BBSSolveStep &command);
virtual void visit(const BBSShiftStep &command);
virtual void visit(const BBSRefitStep &command);
// @}
private:
......
//# AddCommand.h: Query builder for adding a command to the command queue.
//#
//# Copyright (C) 2007
//# ASTRON (Netherlands Foundation for Research in Astronomy)
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program 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 General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id$
#ifndef LOFAR_BBSCONTROL_QUERYBUILDER_ADDCOMMAND_H
#define LOFAR_BBSCONTROL_QUERYBUILDER_ADDCOMMAND_H
// \file
// Query builder for adding a command to the command queue.
#include <BBSControl/CommandVisitor.h>
#include <Common/lofar_string.h>
#include <Common/lofar_iosfwd.h>
namespace LOFAR
{
namespace BBS
{
//# Forward declarations
class Command;
class BBSSingleStep;
namespace QueryBuilder
{
// Concrete CommandVisitor class, implements visit() methods for
// composing the query to add a concrete Command object to the
// CommandQueue. Knowledge about the database structure of the command
// queue and its stored procedures are kept within this class.
class AddCommand : public CommandVisitor
{
public:
// Destructor.
virtual ~AddCommand();
// @{
virtual void visit(const InitializeCommand &command);
virtual void visit(const FinalizeCommand &command);
virtual void visit(const NextChunkCommand &command);
virtual void visit(const BBSStrategy &command);
virtual void visit(const BBSMultiStep &command);
virtual void visit(const BBSPredictStep &command);
virtual void visit(const BBSSubtractStep &command);
virtual void visit(const BBSCorrectStep &command);
virtual void visit(const BBSSolveStep &command);
virtual void visit(const BBSShiftStep &command);
virtual void visit(const BBSRefitStep &command);
// @}
// Return the composed query.
const string& getQuery() const;
private:
// Return the SELECT clause.
// @{
string selectClause(const Command& command) const;
string selectClause(const BBSStrategy&) const;
// @}
// Start the argument list
// @{
string beginArgumentList(const Command&) const;
string beginArgumentList(const BBSStrategy&) const;
// @}
// End the argument list
// @{
string endArgumentList(const Command&) const;
string endArgumentList(const BBSStrategy&) const;
// @}
// Return the argument list.
// @{
string argumentList(const BBSStrategy& command) const;
string argumentList(const BBSSingleStep& command) const;
string argumentList(const BBSSolveStep& command) const;
// @}
// String holding the composed query.
string itsQuery;
};
} //# namespace QueryBuilder
} //# namespace BBS
} //# namespace LOFAR
#endif
//# KernelCommandControl.cc:
//# CommandExecutor.cc:
//#
//# Copyright (C) 2007
//# ASTRON (Netherlands Foundation for Research in Astronomy)
......@@ -21,7 +21,7 @@
//# $Id$
#include <lofar_config.h>
#include <BBSControl/KernelCommandControl.h>
#include <BBSControl/CommandExecutor.h>
#include <BBSControl/CommandQueue.h>
#include <BBSControl/BBSStructs.h>
......@@ -32,9 +32,7 @@
#include <BBSControl/IterationResult.h>
#include <BBSControl/BBSStrategy.h>
#include <BBSControl/BBSStep.h>
#include <BBSControl/BBSMultiStep.h>
#include <BBSControl/BBSSingleStep.h>
#include <BBSControl/BBSPredictStep.h>
#include <BBSControl/BBSSubtractStep.h>
#include <BBSControl/BBSCorrectStep.h>
......@@ -61,7 +59,7 @@ template class BlobStreamableVector<IterationRequest>;
template class BlobStreamableVector<IterationResult>;
bool KernelCommandControl::convertTime(string in, double &out)
bool CommandExecutor::convertTime(string in, double &out)
{
//# TODO: Convert from default epoch to MS epoch (as it may differ from
//# the default!)
......@@ -75,7 +73,7 @@ bool KernelCommandControl::convertTime(string in, double &out)
}
void KernelCommandControl::handle(const InitializeCommand &command)
void CommandExecutor::visit(const InitializeCommand &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -150,7 +148,7 @@ void KernelCommandControl::handle(const InitializeCommand &command)
}
void KernelCommandControl::handle(const FinalizeCommand &command)
void CommandExecutor::visit(const FinalizeCommand &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -158,7 +156,7 @@ void KernelCommandControl::handle(const FinalizeCommand &command)
}
void KernelCommandControl::handle(const NextChunkCommand &command)
void CommandExecutor::visit(const NextChunkCommand &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -181,7 +179,7 @@ void KernelCommandControl::handle(const NextChunkCommand &command)
}
void KernelCommandControl::handle(const BBSStrategy &command)
void CommandExecutor::visit(const BBSStrategy &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -192,28 +190,14 @@ void KernelCommandControl::handle(const BBSStrategy &command)
}
void KernelCommandControl::handle(const BBSStep &command)
{
LOG_DEBUG("Handling a BBSStep");
LOG_DEBUG_STR("Command: " << endl << command);
}
void KernelCommandControl::handle(const BBSMultiStep &command)
void CommandExecutor::visit(const BBSMultiStep &command)
{
LOG_DEBUG("Handling a BBSMultiStep");
LOG_DEBUG_STR("Command: " << endl << command);
}
void KernelCommandControl::handle(const BBSSingleStep &command)
{
LOG_DEBUG("Handling a BBSSingleStep");
LOG_DEBUG_STR("Command: " << endl << command);
}
void KernelCommandControl::handle(const BBSPredictStep &command)
void CommandExecutor::visit(const BBSPredictStep &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -240,7 +224,7 @@ void KernelCommandControl::handle(const BBSPredictStep &command)
}
void KernelCommandControl::handle(const BBSSubtractStep &command)
void CommandExecutor::visit(const BBSSubtractStep &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -267,7 +251,7 @@ void KernelCommandControl::handle(const BBSSubtractStep &command)
}
void KernelCommandControl::handle(const BBSCorrectStep &command)
void CommandExecutor::visit(const BBSCorrectStep &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -294,7 +278,7 @@ void KernelCommandControl::handle(const BBSCorrectStep &command)
}
void KernelCommandControl::handle(const BBSSolveStep &command)
void CommandExecutor::visit(const BBSSolveStep &command)
{
LOG_TRACE_FLOW(AUTO_FUNCTION_NAME);
......@@ -517,14 +501,14 @@ void KernelCommandControl::handle(const BBSSolveStep &command)
}
void KernelCommandControl::handle(const BBSShiftStep &command)
void CommandExecutor::visit(const BBSShiftStep &command)
{
LOG_DEBUG("Handling a BBSShiftStep");
LOG_DEBUG_STR("Command: " << endl << command);
}
void KernelCommandControl::handle(const BBSRefitStep &command)
void CommandExecutor::visit(const BBSRefitStep &command)
{
LOG_DEBUG("Handling a BBSRefitStep");
LOG_DEBUG_STR("Command: " << endl << command);
......
//# AddCommand.cc: one line description
//#
//# Copyright (C) 2002-2004
//# ASTRON (Netherlands Foundation for Research in Astronomy)
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program 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 General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id$
//# Always #include <lofar_config.h> first!
#include <lofar_config.h>
//# Includes
#include <BBSControl/QueryBuilder/AddCommand.h>
#include <BBSControl/InitializeCommand.h>
#include <BBSControl/FinalizeCommand.h>
#include <BBSControl/NextChunkCommand.h>
#include <BBSControl/BBSStrategy.h>
#include <BBSControl/BBSMultiStep.h>
#include <BBSControl/BBSPredictStep.h>
#include <BBSControl/BBSSubtractStep.h>
#include <BBSControl/BBSCorrectStep.h>
#include <BBSControl/BBSSolveStep.h>
#include <BBSControl/BBSShiftStep.h>
#include <BBSControl/BBSRefitStep.h>
#include <BBSControl/Exceptions.h>
#include <Common/LofarLogger.h>
namespace LOFAR
{
namespace BBS
{
using LOFAR::operator<<;
namespace QueryBuilder
{
//##-------- P u b l i c m e t h o d s --------##//
AddCommand::~AddCommand()
{
}
void AddCommand::visit(const InitializeCommand &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
}
void AddCommand::visit(const FinalizeCommand &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
}
void AddCommand::visit(const NextChunkCommand &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
}
void AddCommand::visit(const BBSStrategy &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSMultiStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
THROW (CommandQueueException,
command.type() << " cannot be added to the command queue.");
}
void AddCommand::visit(const BBSPredictStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSSubtractStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSCorrectStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSSolveStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSShiftStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
void AddCommand::visit(const BBSRefitStep &command)
{
LOG_TRACE_LIFETIME_STR(TRACE_LEVEL_COND, command.type());
itsQuery =
selectClause(command) +
beginArgumentList(command) +
argumentList(command) +
endArgumentList(command);
}
const string& AddCommand::getQuery() const
{
return itsQuery;
}
//##-------- P r i v a t e m e t h o d s --------##//
string AddCommand::selectClause(const Command& command) const
{
return
"SELECT * FROM blackboard.add_" +
toLower(command.type()) +
"_command";
}
string AddCommand::selectClause(const BBSStrategy&) const
{
return "SELECT * FROM blackboard.set_strategy";
}
string AddCommand::beginArgumentList(const Command&) const
{
return "(ROW(";
}
string AddCommand::endArgumentList(const Command&) const
{
return "))";
}
string AddCommand::beginArgumentList(const BBSStrategy&) const
{
return "(";
}
string AddCommand::endArgumentList(const BBSStrategy&) const
{
return ") AS result";
}
string AddCommand::argumentList(const BBSStrategy& strategy) const
{
ostringstream oss;
oss << "'" << strategy.dataSet() << "'"
<< ",'" << strategy.parmDB().localSky << "'"
<< ",'" << strategy.parmDB().instrument << "'"
<< ",'" << strategy.parmDB().history << "'"
<< ",'" << strategy.stations() << "'"
<< ",'" << strategy.inputData() << "'"
<< ",'" << strategy.regionOfInterest().frequency << "'"
<< ",'" << strategy.regionOfInterest().time << "'"
<< ",'" << strategy.domainSize().bandWidth << "'"
<< ",'" << strategy.domainSize().timeInterval << "'"
<< ",'" << strategy.correlation().selection << "'"
<< ",'" << strategy.correlation().type << "'";
return oss.str();
}
string AddCommand::argumentList(const BBSSingleStep& step) const
{
ostringstream oss;
oss << "'" << step.getName() << "'"
<< ",'" << step.operation() << "'"
<< ",'" << step.baselines().station1 << "'"
<< ",'" << step.baselines().station2 << "'"
<< ",'" << step.correlation().selection << "'"
<< ",'" << step.correlation().type << "'"
<< ",'" << step.sources() << "'"
<< ",'" << step.instrumentModels() << "'"
<< ",'" << step.outputData() << "'";
return oss.str();
}
string AddCommand::argumentList(const BBSSolveStep& step) const
{
ostringstream oss;
oss << argumentList(static_cast<const BBSSingleStep&>(step))
<< ",'" << step.maxIter() << "'"
<< ",'" << step.epsilon() << "'"
<< ",'" << step.minConverged() << "'"
<< ",'" << step.parms() << "'"
<< ",'" << step.exclParms() << "'"
<< ",'" << step.domainSize().bandWidth << "'"
<< ",'" << step.domainSize().timeInterval << "'";
return oss.str();
}
} // namespace QueryBuilder
} // namespace BBS
} // namespace LOFAR
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment