Skip to content

Commit

Permalink
Remove duplicate multilang database queries.
Browse files Browse the repository at this point in the history
Fixes #8914
  • Loading branch information
andrepereiradasilva authored and wilsonge committed Jan 21, 2016
1 parent d1ccb9c commit c684036
Show file tree
Hide file tree
Showing 8 changed files with 149 additions and 140 deletions.
35 changes: 3 additions & 32 deletions administrator/components/com_categories/helpers/categories.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,40 +99,11 @@ public static function getActions($extension, $categoryId = 0)
*/
public static function getAssociations($pk, $extension = 'com_content')
{
$langAssociations = JLanguageAssociations::getAssociations($extension, '#__categories', 'com_categories.item', $pk, 'id', 'alias', '');
$associations = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->from('#__categories as c')
->join('INNER', '#__associations as a ON a.id = c.id AND a.context=' . $db->quote('com_categories.item'))
->join('INNER', '#__associations as a2 ON a.key = a2.key')
->join('INNER', '#__categories as c2 ON a2.id = c2.id AND c2.extension = ' . $db->quote($extension))
->where('c.id =' . (int) $pk)
->where('c.extension = ' . $db->quote($extension));
$select = array(
'c2.language',
$query->concatenate(array('c2.id', 'c2.alias'), ':') . ' AS id'
);
$query->select($select);
$db->setQuery($query);

try
{
$contentitems = $db->loadObjectList('language');
}
catch (RuntimeException $exception)
foreach ($langAssociations as $langAssociation)
{
JError::raiseWarning(500, $exception->getMessage());

return array();
}

foreach ($contentitems as $tag => $item)
{
// Do not return itself as result
if ((int) $item->id != $pk)
{
$associations[$tag] = $item->id;
}
$associations[$langAssociation->language] = $langAssociation->id;
}

return $associations;
Expand Down
29 changes: 8 additions & 21 deletions administrator/components/com_languages/helpers/multilangstatus.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,41 +78,28 @@ public static function getContentlangs()
* Method to return a list of published site languages.
*
* @return array of language extension objects.
*
* @deprecated 4.0 Use JLanguageMultilang::getSiteLangs() instead.
*/
public static function getSitelangs()
{
// Check for published Site Languages.
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('a.element AS element')
->from('#__extensions AS a')
->where('a.type = ' . $db->quote('language'))
->where('a.client_id = 0')
->where('a.enabled = 1');
$db->setQuery($query);
JLog::add(__METHOD__ . ' is deprecated, use JLanguageMultilang::getSiteLangs() instead.', JLog::WARNING, 'deprecated');

return $db->loadObjectList('element');
return JLanguageMultilang::getSiteLangs();
}

/**
* Method to return a list of language home page menu items.
*
* @return array of menu objects.
*
* @deprecated 4.0 Use JLanguageMultilang::getSiteHomePages() instead.
*/
public static function getHomepages()
{
// Check for Home pages languages.
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('language')
->select('id')
->from($db->quoteName('#__menu'))
->where('home = 1')
->where('published = 1')
->where('client_id = 0');
$db->setQuery($query);
JLog::add(__METHOD__ . ' is deprecated, use JLanguageMultilang::getSiteHomePages() instead.', JLog::WARNING, 'deprecated');

return $db->loadObjectList('language');
return JLanguageMultilang::getSiteHomePages();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ public function display($tpl = null)
$this->switchers = MultilangstatusHelper::getLangswitchers();
$this->listUsersError = MultilangstatusHelper::getContacts();
$this->contentlangs = MultilangstatusHelper::getContentlangs();
$this->site_langs = MultilangstatusHelper::getSitelangs();
$this->site_langs = JLanguageMultilang::getSiteLangs();
$this->statuses = MultilangstatusHelper::getStatus();
$this->homepages = MultilangstatusHelper::getHomepages();
$this->homepages = JLanguageMultilang::getSiteHomePages();

parent::display($tpl);
}
Expand Down
28 changes: 3 additions & 25 deletions administrator/components/com_menus/helpers/menus.php
Original file line number Diff line number Diff line change
Expand Up @@ -316,33 +316,11 @@ public static function getMenuLinks($menuType = null, $parentId = 0, $mode = 0,
*/
public static function getAssociations($pk)
{
$langAssociations = JLanguageAssociations::getAssociations('com_menus', '#__menu', 'com_menus.item', $pk, 'id', '', '');
$associations = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->from('#__menu as m')
->join('INNER', '#__associations as a ON a.id=m.id AND a.context=' . $db->quote('com_menus.item'))
->join('INNER', '#__associations as a2 ON a.key=a2.key')
->join('INNER', '#__menu as m2 ON a2.id=m2.id')
->where('m.id=' . (int) $pk)
->select('m2.language, m2.id');
$db->setQuery($query);

try
foreach ($langAssociations as $langAssociation)
{
$menuitems = $db->loadObjectList('language');
}
catch (RuntimeException $e)
{
throw new Exception($e->getMessage(), 500);
}

foreach ($menuitems as $tag => $item)
{
// Do not return itself as result
if ((int) $item->id != $pk)
{
$associations[$tag] = $item->id;
}
$associations[$langAssociation->language] = $langAssociation->id;
}

return $associations;
Expand Down
120 changes: 67 additions & 53 deletions libraries/cms/language/associations.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,74 +37,88 @@ class JLanguageAssociations
*/
public static function getAssociations($extension, $tablename, $context, $id, $pk = 'id', $aliasField = 'alias', $catField = 'catid')
{
$associations = array();
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName('c2.language'))
->from($db->quoteName($tablename, 'c'))
->join('INNER', $db->quoteName('#__associations', 'a') . ' ON a.id = c.' . $db->quoteName($pk) . ' AND a.context=' . $db->quote($context))
->join('INNER', $db->quoteName('#__associations', 'a2') . ' ON a.key = a2.key')
->join('INNER', $db->quoteName($tablename, 'c2') . ' ON a2.id = c2.' . $db->quoteName($pk));

// Use alias field ?
if (!empty($aliasField))
{
$query->select(
$query->concatenate(
array(
$db->quoteName('c2.' . $pk),
$db->quoteName('c2.' . $aliasField)
),
':'
) . ' AS ' . $db->quoteName($pk)
);
}
else
{
$query->select($db->quoteName('c2.' . $pk));
}
// To avoid doing duplicate database queries.
static $multilanguageAssociations = array();

// Use catid field ?
if (!empty($catField))
// Multilanguage association array key. If the key is already in the array we don't need to run the query again, just return it.
$queryKey = implode('|', func_get_args());
if (!isset($multilanguageAssociations[$queryKey]))
{
$query->join(
'INNER',
$db->quoteName('#__categories', 'ca') . ' ON ' . $db->quoteName('c2.' . $catField) . ' = ca.id AND ca.extension = ' . $db->quote($extension)
)
->select(
$multilanguageAssociations[$queryKey] = array();

$db = JFactory::getDbo();
$categoriesExtraSql = (($tablename === '#__categories') ? ' AND c2.extension = ' . $db->quote($extension) : '');
$query = $db->getQuery(true)
->select($db->quoteName('c2.language'))
->from($db->quoteName($tablename, 'c'))
->join('INNER', $db->quoteName('#__associations', 'a') . ' ON a.id = c.' . $db->quoteName($pk) . ' AND a.context=' . $db->quote($context))
->join('INNER', $db->quoteName('#__associations', 'a2') . ' ON a.key = a2.key')
->join('INNER', $db->quoteName($tablename, 'c2') . ' ON a2.id = c2.' . $db->quoteName($pk) . $categoriesExtraSql);

// Use alias field ?
if (!empty($aliasField))
{
$query->select(
$query->concatenate(
array('ca.id', 'ca.alias'),
array(
$db->quoteName('c2.' . $pk),
$db->quoteName('c2.' . $aliasField)
),
':'
) . ' AS ' . $db->quoteName($catField)
) . ' AS ' . $db->quoteName($pk)
);
}
}
else
{
$query->select($db->quoteName('c2.' . $pk));
}

$query->where('c.' . $pk . ' = ' . (int) $id);
// Use catid field ?
if (!empty($catField))
{
$query->join(
'INNER',
$db->quoteName('#__categories', 'ca') . ' ON ' . $db->quoteName('c2.' . $catField) . ' = ca.id AND ca.extension = ' . $db->quote($extension)
)
->select(
$query->concatenate(
array('ca.id', 'ca.alias'),
':'
) . ' AS ' . $db->quoteName($catField)
);
}

$db->setQuery($query);
$query->where('c.' . $pk . ' = ' . (int) $id);
if ($tablename === '#__categories')
{
$query->where('c.extension = ' . $db->quote($extension));
}

try
{
$items = $db->loadObjectList('language');
}
catch (RuntimeException $e)
{
throw new Exception($e->getMessage(), 500, $e);
}
$db->setQuery($query);

if ($items)
{
foreach ($items as $tag => $item)
try
{
$items = $db->loadObjectList('language');
}
catch (RuntimeException $e)
{
throw new Exception($e->getMessage(), 500, $e);
}

if ($items)
{
// Do not return itself as result
if ((int) $item->{$pk} != $id)
foreach ($items as $tag => $item)
{
$associations[$tag] = $item;
// Do not return itself as result
if ((int) $item->{$pk} != $id)
{
$multilanguageAssociations[$queryKey][$tag] = $item;
}
}
}
}

return $associations;
return $multilanguageAssociations[$queryKey];
}

/**
Expand Down
61 changes: 61 additions & 0 deletions libraries/cms/language/multilang.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,65 @@ public static function isEnabled()

return $enabled;
}

/**
* Method to return a list of published site languages.
*
* @return array of language extension objects.
*
* @since 3.6
*/
public static function getSiteLangs()
{
// To avoid doing duplicate database queries.
static $multilangSiteLangs = null;

if (!isset($multilangSiteLangs))
{
// Check for published Site Languages.
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('element')
->from('#__extensions')
->where('type = ' . $db->quote('language'))
->where('client_id = 0')
->where('enabled = 1');
$db->setQuery($query);

$multilangSiteLangs = $db->loadObjectList('element');
}

return $multilangSiteLangs;
}

/**
* Method to return a list of language home page menu items.
*
* @return array of menu objects.
*
* @since 3.6
*/
public static function getSiteHomePages()
{
// To avoid doing duplicate database queries.
static $multilangSiteHomePages = null;

if (!isset($multilangSiteHomePages))
{
// Check for Home pages languages.
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select('language')
->select('id')
->from($db->quoteName('#__menu'))
->where('home = 1')
->where('published = 1')
->where('client_id = 0');
$db->setQuery($query);

$multilangSiteHomePages = $db->loadObjectList('language');
}

return $multilangSiteHomePages;
}
}
3 changes: 1 addition & 2 deletions modules/mod_languages/helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
defined('_JEXEC') or die;

JLoader::register('MenusHelper', JPATH_ADMINISTRATOR . '/components/com_menus/helpers/menus.php');
JLoader::register('MultilangstatusHelper', JPATH_ADMINISTRATOR . '/components/com_languages/helpers/multilangstatus.php');

/**
* Helper for mod_languages
Expand Down Expand Up @@ -74,7 +73,7 @@ public static function getList(&$params)
}

$levels = $user->getAuthorisedViewLevels();
$sitelangs = MultilangstatusHelper::getSitelangs();
$sitelangs = JLanguageMultilang::getSiteLangs();
$multilang = JLanguageMultilang::isEnabled();

// Filter allowed languages
Expand Down

0 comments on commit c684036

Please sign in to comment.