MeasureRecord MeasureGroupRecord_Impl::getMeasureRecord(int measureVectorIndex) const
  {
    ProjectDatabase database = this->projectDatabase();
    OptionalMeasureRecord candidate;

    QSqlQuery query(*(database.qSqlDatabase()));
    query.prepare(toQString("SELECT * FROM " + MeasureRecord::databaseTableName() +
        " WHERE variableRecordId=:variableRecordId AND measureVectorIndex=:measureVectorIndex"));
    query.bindValue(":variableRecordId", this->id());
    query.bindValue(":measureVectorIndex", measureVectorIndex);
    assertExec(query);
    if (query.first()) {
      candidate = MeasureRecord::factoryFromQuery(query,database).get();
    }

    // check actual vector index. can get out of date during construction.
    if ((!candidate) ||
        (!candidate->measureVectorIndex()) ||
        (candidate->measureVectorIndex().get() != measureVectorIndex))
    {
      // get all and look for index by hand
      for (const MeasureRecord& dpr : measureRecords(false)) {
        if (dpr.measureVectorIndex() && (dpr.measureVectorIndex().get() == measureVectorIndex)) {
          return dpr;
        }
      }
    }
    else {
      return *candidate;
    }
    LOG_AND_THROW("Invalid DiscretMeasure measureVectorIndex "
        << measureVectorIndex << " for MeasureGroup '" << name() << "'.");
    return MeasureRecord(std::shared_ptr<detail::MeasureRecord_Impl>(),database);
  }
Example #2
0
MeasureRecord MeasureRecord::factoryFromMeasure(
    const analysis::Measure& measure,
    MeasureGroupRecord& measureGroupRecord,
    int measureVectorIndex)
{
  if (measure.optionalCast<analysis::NullMeasure>()) {
    return NullMeasureRecord(measure.cast<analysis::NullMeasure>(),
                                  measureGroupRecord,
                                  measureVectorIndex);
  }
  else if (measure.optionalCast<analysis::RubyMeasure>()) {
    return RubyMeasureRecord(measure.cast<analysis::RubyMeasure>(),
                                  measureGroupRecord,
                                  measureVectorIndex);
  }

  OS_ASSERT(false);
  return MeasureRecord(std::shared_ptr<detail::MeasureRecord_Impl>());
}
Example #3
0
boost::optional<MeasureRecord> MeasureRecord::factoryFromQuery(const QSqlQuery& query, ProjectDatabase& database)
{
  std::shared_ptr<detail::MeasureRecord_Impl> impl;

  int measureRecordType = query.value(MeasureRecordColumns::measureRecordType).toInt();

  switch (measureRecordType){
    case MeasureRecordType::RubyMeasureRecord:
      impl = std::shared_ptr<detail::RubyMeasureRecord_Impl>(new detail::RubyMeasureRecord_Impl(query, database));
      break;
    case MeasureRecordType::NullMeasureRecord:
      impl = std::shared_ptr<detail::NullMeasureRecord_Impl>(new detail::NullMeasureRecord_Impl(query, database));
      break;
    default:
      LOG(Error, "Unknown measureRecordType " << measureRecordType);
      return boost::none;
  }

  return MeasureRecord(impl, database);
}