Public Types | Public Member Functions

ConvertableUnitModel Class Reference

Unit container model. More...

#include <unitmodel.h>

Inheritance diagram for ConvertableUnitModel:
Inheritance graph
[legend]
Collaboration diagram for ConvertableUnitModel:
Collaboration graph
[legend]

List of all members.

Public Types

enum  Fields { UnitToId = Qt::UserRole + 900, UnitToSymbol, UnitFromId, UnitFromSymbol }
enum  ConstraintKind { ConstraintKindTreeId }

Public Member Functions

 ConvertableUnitModel (QObject *parent=0)
QVariant data (const QModelIndex &index, int role) const
QVariant currentConstraintUnitId () const
void setConstraint (const int &id, const ConvertableUnitModel::ConstraintKind &kind, const bool &constrainUnitTo=true, const bool &showUnitFrom=true, const bool &calibrationUnit=false)
void unconstrain ()
bool isUnitToConstrained ()
bool isUnitFromConstrained ()

Detailed Description

Unit container model.

By default it only shows the units for which a conversion function exists in the database for existing sensors.

Todo:
I think the best way is to only store SI units and derived SI units. Prefixes like milli, etc. should be auto-computed, possibly through the application. I think that not doing it this way the unit table might get overcrowded. Sensor units aren't such a problem as the varieties of the calibration units. Autocomputing doesn't work because the source unit is stored in the template and must be always the same. So the prefixed unit must be stored in units. Check ConvertableUnitModel for more information.

What I tried to do was to split prefix and units in tbl_units and tbl_unit_prefixes like this:

    CREATE TABLE tbl_unit_prefixes(
      unit_prefix_symbol character varying NOT NULL PRIMARY KEY,
      unit_prefix_name character varying NOT NULL UNIQUE,
      unit_prefix_factor double precision NOT NULL
    );

tbl_units can also have a unit_isprefixable bool column.

Then we use the query:

    SELECT unit_prefix_symbol || unit_symbol
    FROM tbl_units u, tbl_unit_prefixes p
    WHERE u.unit_isprefixable;

which gives nice results.

Unfortunately, the problem of id's and uniqye names remains here too. Materializing them is a possible solution.


Member Enumeration Documentation

Enumerator:
ConstraintKindTreeId 

                        { //moet eenduiding een sens_id specifieren!!
        ConstraintKindTreeId
    };

Enumerator:
UnitToId 
UnitToSymbol 
UnitFromId 
UnitFromSymbol 

                {
        UnitToId = Qt::UserRole + 900,
        UnitToSymbol,
        UnitFromId,
        UnitFromSymbol
    };


Constructor & Destructor Documentation

ConvertableUnitModel::ConvertableUnitModel ( QObject parent = 0  ) 

                                                                    : SqlQueryModel(parent)
{
    setDependency("tbl_units");
    setDependency("tbl_sensors");
    setDependency("tbl_sensor_channels");

    // defaultQuery shows all convertable units
    defaultQuery = QString("SELECT DISTINCT \"%1\".unit_symbol AS unit_symbol_%1, \"%1\".unit_id AS unit_id_%1, "
                           "\"%2\".unit_symbol AS unit_symbol_%2, \"%2\".unit_id AS unit_id_%2 "
                           "FROM vew_unit_conversions AS c "
                           "INNER JOIN tbl_units AS \"%1\" ON (c.unit_id_%1 = \"%1\".unit_id) "
                           "INNER JOIN tbl_units AS \"%2\" ON (c.unit_id_%2 = \"%2\".unit_id) ");
    unconstrain();
}


Member Function Documentation

QVariant ConvertableUnitModel::currentConstraintUnitId (  )  const

Referenced by DataHeaderSection::getSqlForColumn().

{
    // als constrained = true, dan doet het er neit toe welke index we nemen, zolang em een valid row heeft.
    if (constrained) return data(index(0,0), constrainedUnitTo ? ConvertableUnitModel::UnitToId : ConvertableUnitModel::UnitFromId);
    else return QVariant();
}

QVariant ConvertableUnitModel::data ( const QModelIndex index,
int  role 
) const

Referenced by currentConstraintUnitId().

{
    //Q_ASSERT(index.isValid());
    if (role == UnitFromSymbol) return this->index(index.row(), record().indexOf("unit_symbol_from")).data(Qt::DisplayRole);
    if (role == UnitFromId) return this->index(index.row(), record().indexOf("unit_id_from")).data(Qt::DisplayRole);
    if (role == UnitToSymbol) return this->index(index.row(), record().indexOf("unit_symbol_to"), index.parent()).data(Qt::DisplayRole);
    if (role == UnitToId) return this->index(index.row(), record().indexOf("unit_id_to"), index.parent()).data(Qt::DisplayRole);
    return QSqlQueryModel::data(index, role);
}

bool ConvertableUnitModel::isUnitFromConstrained (  ) 

Referenced by DataHeaderSection::getSqlForColumn().

{
    return constrained && !constrainedUnitTo;
}

bool ConvertableUnitModel::isUnitToConstrained (  ) 

{
    return constrained && constrainedUnitTo;
}

void ConvertableUnitModel::setConstraint ( const int &  id,
const ConvertableUnitModel::ConstraintKind kind,
const bool &  constrainUnitTo = true,
const bool &  showUnitFrom = true,
const bool &  calibrationUnit = false 
)

Referenced by UnitComboBox::setTreeIdConstraint().

{
    constrainedUnitTo = constrainUnitTo;
    if (kind == ConvertableUnitModel::ConstraintKindTreeId) {
        QString extra;
        if (calibrationUnit) {
            extra.append("INNER JOIN tbl_sensor_channels AS sc ON (sc.sens_chan_cali_unit_id = c.unit_id_%2) ");
            extra.append("INNER JOIN tbl_trees AS t USING (sens_id, sens_chan_nr) ");
        } else {
            extra.append("INNER JOIN tbl_sensors AS s ON (s.unit_id = c.unit_id_%2) ");
            extra.append("INNER JOIN tbl_trees AS t USING (sens_id) ");
        }
        QString query = (defaultQuery + extra).arg(showUnitFrom ? "from" : "to", constrainUnitTo ? "to" : "from");
        qDebug() << "Treeconstraint set in ConvertableUnitModel: " << id;
        if (id == 0 || id == -1 ){
            unconstrain();
            qWarning() << "ConvertableUnitModel got an invalid tree_id. Contact the administrator.";
            return;
        }
        setQuery(Database::execStatic(query + QString(" WHERE tree_id = ") + QString::number(id)));
        constrained = true;
    }
}

void ConvertableUnitModel::unconstrain (  ) 

Referenced by ConvertableUnitModel(), UnitComboBox::reset(), and setConstraint().

{
    // Laat alle convertable units zien
    setQuery(Database::execStatic(defaultQuery.arg("from", "to")));
    constrained = false;
}


The documentation for this class was generated from the following files: