public function getAnswerStats(Answer $answer) { $results = array(); foreach (User::getDimensionsExpanded() as $curField => $curDimension) { $stats = $this->em->getManager()->createQuery('SELECT ans.dimensionValue, ans.percentage FROM AppBundle\\Entity\\AnswerStat ans INDEX BY ans.dimensionValue WHERE ans.answer = :answer AND ans.dimension = :curField')->setParameter('answer', $answer)->setParameter('curField', $curField)->useQueryCache(true)->useResultCache(true)->getResult(); foreach ($curDimension as $curValue) { if ($curValue == 'UNKNOWN') { continue; } if (!isset($stats[$curValue])) { continue; } $percentage = $stats[$curValue]['percentage']; if ($percentage <= 0) { continue; } $results[$curField][$curValue] = $stats[$curValue]; $results[$curField][$curValue]['percentage'] = $percentage; } } return $results; }
public function getSectionStats(Section $section = null, User $user = null) { // Section -> question -> selectedAnswer -> dimensions percentage // / // Section -> question -> selectedAnswer -> total percentage $results = array(); $generalPopulationStats = $this->em->getManager()->createQuery('SELECT a.id, (SELECT COUNT(uaa.id) FROM AppBundle\\Entity\\UserAnswer uaa JOIN uaa.user u WHERE uaa.answer = a) as votes, (SELECT COUNT(uaaa.id) FROM AppBundle\\Entity\\UserAnswer uaaa JOIN uaaa.answer aa JOIN uaaa.user uu WHERE aa.question = a.question) as sumVotes FROM AppBundle\\Entity\\Answer a INDEX BY a.id JOIN a.question qs JOIN a.userAnswers uas WHERE uas.user = :user' . (isset($section) ? ' AND qs.section = :section' : ''))->useQueryCache(true)->useResultCache(true)->setParameter('user', $user); if (isset($section)) { $generalPopulationStats->setParameter('section', $section); } $generalPopulationStats = $generalPopulationStats->getResult(); foreach ($generalPopulationStats as &$curStat) { $curStat['percentage'] = $curStat['votes'] / $curStat['sumVotes']; } foreach (User::getDimensionsExpanded() as $curField => $curDimension) { foreach ($curDimension as $curValue) { if ($curValue == 'UNKNOWN') { continue; } if ($curValue == 'RETIRED') { continue; } $tstats = $this->em->getManager()->createQuery('SELECT a.id, (SELECT COUNT(uaab.id) FROM AppBundle\\Entity\\UserAnswer uaab WHERE uaab.answer = a) as votes, (SELECT COUNT(uaa.id) FROM AppBundle\\Entity\\UserAnswer uaa JOIN uaa.user u WHERE uaa.answer = a AND u.' . $curField . ' = :' . $curField . ') as dimVotes, (SELECT COUNT(uaaa.id) FROM AppBundle\\Entity\\UserAnswer uaaa JOIN uaaa.answer aa JOIN uaaa.user uu WHERE aa.question = a.question AND uu.' . $curField . ' = :' . $curField . ') as sumVotes FROM AppBundle\\Entity\\Answer a INDEX BY a.id JOIN a.question qs JOIN a.userAnswers uas WHERE uas.user = :user' . (isset($section) ? ' AND qs.section = :section' : ''))->useQueryCache(true)->useResultCache(true)->setParameter('user', $user); if (isset($section)) { $tstats->setParameter('section', $section); } $tstats = $tstats->setParameter($curField, $curValue)->getResult(); foreach ($tstats as &$curStat) { if ($curStat['sumVotes'] > 0) { $curStat['percentage'] = $curStat['dimVotes'] / $curStat['votes']; // Percentage of e.g. men who answered this compared to everyone who answered this $tstatPercentage = $curStat['dimVotes'] / $curStat['sumVotes']; // Percentage of e.g. men who answered this compared to all men (on any answer) if ($tstatPercentage > $generalPopulationStats[$curStat['id']]['percentage']) { $curStat['weight'] = $tstatPercentage * 100 - $generalPopulationStats[$curStat['id']]['percentage'] * 100; } else { $curStat['weight'] = 0; } } else { $curStat['percentage'] = 0; $curStat['weight'] = 0; } } // Find the weighted mean $sum = 0; $weightSum = 0; foreach ($tstats as $curStat) { $sum = $sum + $curStat['weight'] * $curStat['percentage']; $weightSum = $weightSum + $curStat['weight']; } //$percentage = $sum/$weightSum; $percentage = $sum / $weightSum; $percentage = round($percentage * 100, 1); if ($percentage <= 0) { continue; } $results[$curField][$curValue] = array(); $results[$curField][$curValue]['percentage'] = $percentage; } uasort($results[$curField], function ($a, $b) { if ($a['percentage'] == $b['percentage']) { return 0; } return $a['percentage'] < $b['percentage'] ? 1 : -1; }); } return $results; }
/** * @Route("/final_results_change", name="final_results_change") */ public function finalResultChangeAction(Request $request) { $user = $this->container->get('doctrine')->getManager()->getRepository('AppBundle\\Entity\\User')->findOneBy(array('sessionId' => $request->getSession()->getId())); $dimensions = User::getDimensionsExpanded(); $form = $this->createForm(new UserType($request->get('dimension'), $dimensions[$request->get('dimension')]), $user); if ('POST' == $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { $this->container->get('doctrine')->getManager()->persist($form->getData()); $this->container->get('doctrine')->getManager()->flush($form->getData()); } else { return new Response($form->getErrorsAsString(), 400); } } return new Response('', 204); }
private function isValidProfileDimension($dimensionId) { $dimension = $this->dimensionIds[$dimensionId]; $profileDimensions = User::getDimensionsExpanded(); if (in_array($dimension, array_keys($profileDimensions))) { return true; } else { return false; } }