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); }
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>()); }
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); }