Improve queries speed

pull/3215/head
Julio Montoya 6 years ago
parent ef42815c54
commit bccf361a8e
  1. 2
      config/bundles.php
  2. 86
      public/main/inc/lib/api.lib.php
  3. 4
      public/main/inc/lib/course.lib.php
  4. 17
      src/CoreBundle/Controller/CourseHomeController.php
  5. 6
      src/CoreBundle/Controller/ResourceController.php
  6. 2
      src/CoreBundle/Entity/Resource/AbstractResource.php
  7. 2
      src/CoreBundle/Entity/Resource/ResourceLink.php
  8. 2
      src/CoreBundle/Entity/Resource/ResourceNode.php
  9. 12
      src/CoreBundle/EventListener/LocaleListener.php
  10. 22
      src/CoreBundle/Repository/ResourceRepository.php
  11. 6
      src/CoreBundle/ToolChain.php
  12. 3
      src/CourseBundle/Repository/CToolRepository.php
  13. 1062
      src/SettingsBundle/Manager/SettingsManager.php
  14. 19
      src/ThemeBundle/EventListener/TwigListener.php

@ -73,5 +73,5 @@ return [
KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true],
Translation\Bundle\TranslationBundle::class => ['all' => true],
Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true],
Knp\DoctrineBehaviors\Bundle\DoctrineBehaviorsBundle::class => ['all' => true],
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
];

@ -1394,7 +1394,6 @@ function _api_format_user($user, $add_password = false, $loadAvatars = true)
$result['icon_status'] = '';
$result['icon_status_medium'] = '';
$result['is_admin'] = UserManager::is_admin($user_id);
// Getting user avatar.
@ -1537,61 +1536,26 @@ function api_get_user_info(
$loadAvatars = true,
$updateCache = false
) {
$apcVar = null;
// Make sure user_id is safe
$user_id = (int) $user_id;
$user = false;
$cacheAvailable = api_get_configuration_value('apc');
if (empty($user_id)) {
$userFromSession = Session::read('_user');
if (isset($userFromSession)) {
if (true === $cacheAvailable &&
(
empty($userFromSession['is_anonymous']) &&
(isset($userFromSession['status']) && ANONYMOUS != $userFromSession['status'])
)
) {
$apcVar = api_get_configuration_value('apc_prefix').'userinfo_'.$userFromSession['user_id'];
if (apcu_exists($apcVar)) {
if ($updateCache) {
apcu_store($apcVar, $userFromSession, 60);
}
$user = apcu_fetch($apcVar);
} else {
$user = _api_format_user(
$userFromSession,
$showPassword,
$loadAvatars
);
apcu_store($apcVar, $user, 60);
}
} else {
$user = _api_format_user(
$userFromSession,
$showPassword,
$loadAvatars
);
}
return $user;
if (isset($userFromSession) && !empty($userFromSession)) {
return $userFromSession;
/*
return _api_format_user(
$userFromSession,
$showPassword,
$loadAvatars
);*/
}
return false;
}
// Make sure user_id is safe
$user_id = (int) $user_id;
// Re-use user information if not stale and already stored in APCu
if (true === $cacheAvailable) {
$apcVar = api_get_configuration_value('apc_prefix').'userinfo_'.$user_id;
if (apcu_exists($apcVar) && false == $updateCache && false == $checkIfUserOnline) {
$user = apcu_fetch($apcVar);
return $user;
}
}
$sql = "SELECT * FROM ".Database::get_main_table(TABLE_MAIN_USER)."
WHERE id = $user_id";
$result = Database::query($sql);
@ -1626,10 +1590,6 @@ function api_get_user_info(
$user = _api_format_user($result_array, $showPassword, $loadAvatars);
}
if (true === $cacheAvailable) {
apcu_store($apcVar, $user, 60);
}
return $user;
}
@ -6202,32 +6162,6 @@ function api_get_access_url_from_user($user_id)
return $list;
}
/**
* Gets the status of a user in a course.
*
* @param int $user_id
* @param int $courseId
*
* @return int user status
*/
function api_get_status_of_user_in_course($user_id, $courseId)
{
$tbl_rel_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
if (!empty($user_id) && !empty($courseId)) {
$user_id = intval($user_id);
$courseId = intval($courseId);
$sql = 'SELECT status
FROM '.$tbl_rel_course_user.'
WHERE user_id='.$user_id.' AND c_id = '.$courseId;
$result = Database::query($sql);
$row_status = Database::fetch_array($result, 'ASSOC');
return $row_status['status'];
} else {
return 0;
}
}
/**
* Checks whether the curent user is in a group or not.
*

@ -2024,10 +2024,10 @@ class CourseManager
$teachers['status'] = $teacher['status'];
$teachers['fullname'] = api_get_person_name($teacher['firstname'], $teacher['lastname']);
$teachers['avatar'] = '';
if ($loadAvatars) {
/*if ($loadAvatars) {
$userPicture = UserManager::getUserPicture($teacher['user_id'], USER_IMAGE_SIZE_SMALL);
$teachers['avatar'] = $userPicture;
}
}*/
$teachers['url'] = $url.'&user_id='.$teacher['user_id'];
$listTeachers[] = $teachers;
}

@ -6,6 +6,8 @@ namespace Chamilo\CoreBundle\Controller;
use Career;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Tool;
use Chamilo\CoreBundle\ToolChain;
use Chamilo\CourseBundle\Controller\ToolBaseController;
use Chamilo\CourseBundle\Entity\CTool;
@ -15,6 +17,7 @@ use Chamilo\CourseBundle\Repository\CToolRepository;
use CourseManager;
use Database;
use Display;
use Doctrine\ORM\Query\Expr\Join;
use Event;
use ExtraFieldValue;
use Fhaculty\Graph\Graph;
@ -112,18 +115,19 @@ class CourseHomeController extends ToolBaseController
);*/
$qb = $toolRepository->getResourcesByCourse($course, $this->getSession());
$qb->addSelect('tool');
$qb->innerJoin(
'resource.tool',
'tool'
);
$result = $qb->getQuery()->getResult();
$shortcutQuery = $shortcutRepository->getResources($this->getUser(), $course->getResourceNode(), $course);
$shortcuts = $shortcutQuery->getQuery()->getResult();
$tools = [];
/** @var CTool $item */
foreach ($result as $item) {
if ('course_tool' === $item->getTool()->getName()) {
if ('course_tool' === $item->getName()) {
continue;
}
$toolModel = $toolChain->getToolFromName($item->getTool()->getName());
if ('admin' === $toolModel->getCategory() && !$this->isGranted('ROLE_CURRENT_COURSE_TEACHER')) {
@ -191,6 +195,9 @@ class CourseHomeController extends ToolBaseController
\Exercise::cleanSessionVariables();
\DocumentManager::removeGeneratedAudioTempFile();
$shortcutQuery = $shortcutRepository->getResources($this->getUser(), $course->getResourceNode(), $course);
$shortcuts = $shortcutQuery->getQuery()->getResult();
return $this->render(
'@ChamiloTheme/Course/home.html.twig',
[

@ -126,6 +126,11 @@ class ResourceController extends AbstractResourceController implements CourseCon
$source->initQueryBuilder($qb);
$grid->setSource($source);
/*$result = $qb->getQuery()->getResult();
foreach ($result as $data) {
dump(get_class($data));
}*/
$resourceParams = $this->getResourceParams($request);
if (0 === $resourceParams['id']) {
@ -403,7 +408,6 @@ class ResourceController extends AbstractResourceController implements CourseCon
$myRowAction->addManipulateRender($setNodeParameters);
$grid->addRowAction($myRowAction);
}
/*$grid->addExport(new CSVExport($this->trans('CSV export'), 'export', ['course' => $courseIdentifier]));
$grid->addExport(
new ExcelExport(

@ -22,7 +22,7 @@ abstract class AbstractResource
* @GRID\Column(field="resourceNode.createdAt", title="Date added", type="datetime")
* @Groups({"list"})
* @ORM\OneToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", mappedBy="resource", cascade={"remove"}, orphanRemoval=true
* targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", mappedBy="resource", cascade={"remove"}, orphanRemoval=true, fetch="EAGER"
* )
* @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="CASCADE")
*/

@ -31,7 +31,7 @@ class ResourceLink
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", inversedBy="resourceLinks")
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", inversedBy="resourceLinks", fetch="EAGER")
* @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $resourceNode;

@ -74,7 +74,7 @@ class ResourceNode
/**
* @var ResourceLink[]
*
* @ORM\OneToMany(targetEntity="ResourceLink", mappedBy="resourceNode", cascade={"remove"})
* @ORM\OneToMany(targetEntity="ResourceLink", mappedBy="resourceNode", cascade={"remove"}, fetch="EAGER")
*/
protected $resourceLinks;

@ -47,7 +47,6 @@ class LocaleListener implements EventSubscriberInterface
if (!$installed) {
return;
}
// Try to see if the locale has been set as a _locale routing parameter (from lang switcher)
//if ($locale = $request->getSession('_locale')) {
if (false) {
@ -76,12 +75,9 @@ class LocaleListener implements EventSubscriberInterface
// 3. Check course locale
$courseId = $request->get('cid');
/** @var EntityManager $em */
$em = $container->get('doctrine')->getManager();
if (!empty($courseId)) {
/** @var Course $course */
$course = $em->getRepository('ChamiloCoreBundle:Course')->find($courseId);
$course = $request->getSession()->get('course');
// 3. Check course locale
/** @var Course $course */
if (!empty($course)) {
@ -126,7 +122,6 @@ class LocaleListener implements EventSubscriberInterface
];
foreach ($priorityList as $setting) {
if (isset($localeList[$setting])) {
//var_dump($setting);
$locale = $localeList[$setting];
}
}
@ -136,11 +131,6 @@ class LocaleListener implements EventSubscriberInterface
$locale = $this->defaultLocale;
}
// Force locale if it was selected from the URL
if (!empty($localeFromUrl)) {
//$locale = $localeFromUrl;
}
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($locale);
$request->getSession()->set('_locale', $locale);

@ -460,18 +460,28 @@ class ResourceRepository extends BaseEntityRepository
$qb = $repo->getEntityManager()->createQueryBuilder()
->select('resource')
->from($className, 'resource')
/* ->innerJoin(
ResourceNode::class,
'node',
Join::WITH,
'resource.resourceNode = node.id'
)*/
->innerJoin(
ResourceNode::class,
'node',
Join::WITH,
'resource.resourceNode = node.id'
'resource.resourceNode',
'node'
)
->innerJoin('node.resourceLinks', 'links')
->leftJoin('node.resourceFile', 'file')
->where('node.resourceType = :type')
->setParameter('type', $type);
$qb
->setParameter('type', $type)
->andWhere('links.course = :course')
->setParameter('course', $course)
/*->addSelect('node')
->addSelect('resource')
->addSelect('links')*/
//->addSelect('node.resourceLinks')
//->addSelect('resource.resourceNode')
;
$isAdmin = $checker->isGranted('ROLE_ADMIN') ||

@ -104,7 +104,6 @@ class ToolChain
foreach ($types as $name => $data) {
$resourceType = new ResourceType();
$resourceType->setName($name);
//$resourceType->setService($data['repository']);
$resourceType->setTool($toolEntity);
$manager->persist($resourceType);
}
@ -188,12 +187,7 @@ class ToolChain
->setTool($toolEntity)
->setName($tool->getName())
->setPosition($position)
//->setCourse($course)
//->setImage($tool->getImage())
//->setName($tool->getName())
->setVisibility($visibility)
//->setLink($tool->getLink())
//->setTarget($tool->getTarget())
->setCategory($tool->getCategory())
;

@ -21,7 +21,6 @@ final class CToolRepository extends ResourceRepository
$repo = $this->getRepository();
$className = $repo->getClassName();
$checker = $this->getAuthorizationChecker();
$reflectionClass = $repo->getClassMetadata()->getReflectionClass();
// Check if this resource type requires to load the base course resources when using a session
@ -74,8 +73,6 @@ final class CToolRepository extends ResourceRepository
$qb->andWhere('links.group IS NULL');
///var_dump($qb->getQuery()->getSQL(), $type->getId(), $parentNode->getId());exit;
return $qb;
}
}

File diff suppressed because it is too large Load Diff

@ -36,11 +36,10 @@ class TwigListener implements EventSubscriberInterface
$container = $this->container;
Container::setContainer($container);
Container::setLegacyServices($container);
//Container::setContainer($container);
//Container::setLegacyServices($container);
$settingsManager = $container->get('chamilo.settings.manager');
$theme = api_get_visual_theme();
$twig = $container->get('twig');
@ -152,7 +151,7 @@ class TwigListener implements EventSubscriberInterface
$appPlugin = new \AppPlugin();
$installedPlugins = $appPlugin->getInstalledPluginListName();
$pluginRegions = $appPlugin->getPluginRegions();
$courseInfo = api_get_course_info();
$regionListContent = [];
foreach ($installedPlugins as $pluginName) {
foreach ($pluginRegions as $region) {
@ -163,17 +162,15 @@ class TwigListener implements EventSubscriberInterface
if ('course_tool_plugin' === $region) {
$courseRegions = $appPlugin->getPluginRegions();
$pluginInfo = $appPlugin->getPluginInfo($pluginName, true);
$courseInfo = api_get_course_info();
if (empty($courseInfo)) {
continue;
}
foreach ($courseRegions as $subRegion) {
if (!empty($courseInfo)) {
if (isset($pluginInfo['obj']) && $pluginInfo['obj'] instanceof \Plugin) {
/** @var \Plugin $plugin */
$plugin = $pluginInfo['obj'];
$regionListContent[$subRegion][] = $plugin->renderRegion($subRegion);
}
if (isset($pluginInfo['obj']) && $pluginInfo['obj'] instanceof \Plugin) {
/** @var \Plugin $plugin */
$plugin = $pluginInfo['obj'];
$regionListContent[$subRegion][] = $plugin->renderRegion($subRegion);
}
}
} else {

Loading…
Cancel
Save