Rex Dieter adf30a
From a04809a44c235bed854adc3bd49ca75b9673bf1f Mon Sep 17 00:00:00 2001
Rex Dieter adf30a
From: Milian Wolff <mail@milianw.de>
Rex Dieter adf30a
Date: Wed, 26 Nov 2014 13:20:05 +0100
Rex Dieter adf30a
Subject: [PATCH 13/30] Intern entity strings for table and column names.
Rex Dieter adf30a
Rex Dieter adf30a
This should drastically cut down on the amount of allocations done
Rex Dieter adf30a
by the AkonadiServer. Currently, the getters will do the conversion
Rex Dieter adf30a
from QLatin1String to QString on every call. By reusing the data
Rex Dieter adf30a
via a function-local static const QString object, we can eliminate
Rex Dieter adf30a
all of these allocations and increase the cache locality as well.
Rex Dieter adf30a
Rex Dieter adf30a
REVIEW: 121255
Rex Dieter adf30a
---
Rex Dieter adf30a
 server/src/storage/entities-source.xsl | 56 +++++++++++++++++++++-------------
Rex Dieter adf30a
 server/src/storage/entities.xsl        |  4 +--
Rex Dieter adf30a
 2 files changed, 36 insertions(+), 24 deletions(-)
Rex Dieter adf30a
Rex Dieter adf30a
diff --git a/server/src/storage/entities-source.xsl b/server/src/storage/entities-source.xsl
Rex Dieter adf30a
index 174cf4f..7090c31 100644
Rex Dieter adf30a
--- a/server/src/storage/entities-source.xsl
Rex Dieter adf30a
+++ b/server/src/storage/entities-source.xsl
Rex Dieter adf30a
@@ -214,36 +214,41 @@ void <xsl:value-of select="$className"/>::
Rex Dieter adf30a
 // SQL table information
Rex Dieter adf30a
 <xsl:text>QString </xsl:text><xsl:value-of select="$className"/>::tableName()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return QLatin1String( "<xsl:value-of select="$tableName"/>" );
Rex Dieter adf30a
+  static const QString tableName = QLatin1String( "<xsl:value-of select="$tableName"/>" );
Rex Dieter adf30a
+  return tableName;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QStringList <xsl:value-of select="$className"/>::columnNames()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  QStringList rv;
Rex Dieter adf30a
+  static const QStringList columns = QStringList()
Rex Dieter adf30a
   <xsl:for-each select="column">
Rex Dieter adf30a
-  rv.append( QLatin1String( "<xsl:value-of select="@name"/>" ) );
Rex Dieter adf30a
+    << <xsl:value-of select="@name"/>Column()
Rex Dieter adf30a
   </xsl:for-each>
Rex Dieter adf30a
-  return rv;
Rex Dieter adf30a
+  ;
Rex Dieter adf30a
+  return columns;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QStringList <xsl:value-of select="$className"/>::fullColumnNames()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  QStringList rv;
Rex Dieter adf30a
+  static const QStringList columns = QStringList()
Rex Dieter adf30a
   <xsl:for-each select="column">
Rex Dieter adf30a
-  rv.append( QLatin1String( "<xsl:value-of select="$tableName"/>.<xsl:value-of select="@name"/>" ) );
Rex Dieter adf30a
+    << <xsl:value-of select="@name"/>FullColumnName()
Rex Dieter adf30a
   </xsl:for-each>
Rex Dieter adf30a
-  return rv;
Rex Dieter adf30a
+  ;
Rex Dieter adf30a
+  return columns;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 <xsl:for-each select="column">
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>Column()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return QLatin1String( "<xsl:value-of select="@name"/>" );
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="@name"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::<xsl:value-of select="@name"/>FullColumnName()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return tableName() + QLatin1String( ".<xsl:value-of select="@name"/>" );
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="$tableName"/>.<xsl:value-of select="@name"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 </xsl:for-each>
Rex Dieter adf30a
 
Rex Dieter adf30a
@@ -399,7 +404,6 @@ QVector<<xsl:value-of select="@table"/>> 
Rex Dieter adf30a
 <xsl:variable name="relationName"><xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation</xsl:variable>
Rex Dieter adf30a
 <xsl:variable name="rightSideClass"><xsl:value-of select="@table2"/></xsl:variable>
Rex Dieter adf30a
 <xsl:variable name="rightSideEntity"><xsl:value-of select="@table2"/></xsl:variable>
Rex Dieter adf30a
-<xsl:variable name="rightSideTable"><xsl:value-of select="@table2"/>Table</xsl:variable>
Rex Dieter adf30a
 
Rex Dieter adf30a
 // data retrieval for n:m relations
Rex Dieter adf30a
 QVector<<xsl:value-of select="$rightSideClass"/>> <xsl:value-of select="$className"/>::<xsl:value-of select="concat(translate(substring(@table2,1,1),'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), substring(@table2,2))"/>s() const
Rex Dieter adf30a
@@ -408,14 +412,17 @@ QVector<<xsl:value-of select="$rightSideClass"/>> 
Rex Dieter adf30a
   if ( !db.isOpen() )
Rex Dieter adf30a
     return QVector<<xsl:value-of select="$rightSideClass"/>>();
Rex Dieter adf30a
 
Rex Dieter adf30a
-  QueryBuilder qb( QLatin1String("<xsl:value-of select="$rightSideTable"/>"), QueryBuilder::Select );
Rex Dieter adf30a
+  QueryBuilder qb( <xsl:value-of select="$rightSideClass"/>::tableName(), QueryBuilder::Select );
Rex Dieter adf30a
+  static const QStringList columns = QStringList()
Rex Dieter adf30a
   <xsl:for-each select="/database/table[@name = $rightSideEntity]/column">
Rex Dieter adf30a
-    qb.addColumn( QLatin1String("<xsl:value-of select="$rightSideTable"/>.<xsl:value-of select="@name"/>" ) );
Rex Dieter adf30a
+    << <xsl:value-of select="$rightSideClass"/>::<xsl:value-of select="@name"/>FullColumnName()
Rex Dieter adf30a
   </xsl:for-each>
Rex Dieter adf30a
-  qb.addJoin( QueryBuilder::InnerJoin, QLatin1String("<xsl:value-of select="$relationName"/>"),
Rex Dieter adf30a
-              QLatin1String("<xsl:value-of select="$relationName"/>.<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>"),
Rex Dieter adf30a
-              QLatin1String("<xsl:value-of select="$rightSideTable"/>.<xsl:value-of select="@column2"/>") );
Rex Dieter adf30a
-  qb.addValueCondition( QLatin1String("<xsl:value-of select="$relationName"/>.<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>"), Query::Equals, id() );
Rex Dieter adf30a
+  ;
Rex Dieter adf30a
+  qb.addColumns(columns);
Rex Dieter adf30a
+  qb.addJoin( QueryBuilder::InnerJoin, <xsl:value-of select="$relationName"/>::tableName(),
Rex Dieter adf30a
+              <xsl:value-of select="$relationName"/>::rightFullColumnName(),
Rex Dieter adf30a
+              <xsl:value-of select="$rightSideClass"/>::<xsl:value-of select="@column2"/>FullColumnName() );
Rex Dieter adf30a
+  qb.addValueCondition( <xsl:value-of select="$relationName"/>::leftFullColumnName(), Query::Equals, id() );
Rex Dieter adf30a
 
Rex Dieter adf30a
   if ( !qb.exec() ) {
Rex Dieter adf30a
     akDebug() << "Error during selection of records from table <xsl:value-of select="@table1"/><xsl:value-of select="@table2"/>Relation"
Rex Dieter adf30a
@@ -546,7 +553,7 @@ bool <xsl:value-of select="$className"/>::update()
Rex Dieter adf30a
   </xsl:for-each>
Rex Dieter adf30a
 
Rex Dieter adf30a
   <xsl:if test="column[@name = 'id']">
Rex Dieter adf30a
-  qb.addValueCondition( QLatin1String("id"), Query::Equals, id() );
Rex Dieter adf30a
+  qb.addValueCondition( idColumn(), Query::Equals, id() );
Rex Dieter adf30a
   </xsl:if>
Rex Dieter adf30a
 
Rex Dieter adf30a
   if ( !qb.exec() ) {
Rex Dieter adf30a
@@ -622,27 +629,32 @@ void <xsl:value-of select="$className"/>::enableCache( bool enable )
Rex Dieter adf30a
 // SQL table information
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::tableName()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return QLatin1String( "<xsl:value-of select="$tableName"/>" );
Rex Dieter adf30a
+  static const QString table = QLatin1String( "<xsl:value-of select="$tableName"/>" );
Rex Dieter adf30a
+  return table;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::leftColumn()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return QLatin1String( "<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>" );
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::leftFullColumnName()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return tableName() + QLatin1String( "." ) + leftColumn();
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="$tableName"/>.<xsl:value-of select="@table1"/>_<xsl:value-of select="@column1"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::rightColumn()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return QLatin1String( "<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>" );
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 
Rex Dieter adf30a
 QString <xsl:value-of select="$className"/>::rightFullColumnName()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  return tableName() + QLatin1String( "." ) + rightColumn();
Rex Dieter adf30a
+  static const QString column = QLatin1String( "<xsl:value-of select="$tableName"/>.<xsl:value-of select="@table2"/>_<xsl:value-of select="@column2"/>" );
Rex Dieter adf30a
+  return column;
Rex Dieter adf30a
 }
Rex Dieter adf30a
 </xsl:template>
Rex Dieter adf30a
 
Rex Dieter adf30a
diff --git a/server/src/storage/entities.xsl b/server/src/storage/entities.xsl
Rex Dieter adf30a
index 033e292..8b0ed03 100644
Rex Dieter adf30a
--- a/server/src/storage/entities.xsl
Rex Dieter adf30a
+++ b/server/src/storage/entities.xsl
Rex Dieter adf30a
@@ -114,7 +114,7 @@ using namespace Akonadi::Server;
Rex Dieter adf30a
 
Rex Dieter adf30a
 QVector<QString> Akonadi::Server::allDatabaseTables()
Rex Dieter adf30a
 {
Rex Dieter adf30a
-  static QVector<QString> allTables = QVector<QString>()
Rex Dieter adf30a
+  static const QVector<QString> allTables = QVector<QString>()
Rex Dieter adf30a
   <xsl:for-each select="database/table">
Rex Dieter adf30a
     << QLatin1String( "<xsl:value-of select="@name"/>Table" )
Rex Dieter adf30a
   </xsl:for-each>
Rex Dieter adf30a
@@ -182,7 +182,7 @@ set<xsl:value-of select="$methodName"/>( <xsl:call-template name="argument"/> )
Rex Dieter adf30a
 
Rex Dieter adf30a
   QueryBuilder qb( tableName(), QueryBuilder::Select );
Rex Dieter adf30a
   qb.addColumns( columnNames() );
Rex Dieter adf30a
-  qb.addValueCondition( QLatin1String("<xsl:value-of select="$key"/>"), Query::Equals, <xsl:value-of select="$key"/> );
Rex Dieter adf30a
+  qb.addValueCondition( <xsl:value-of select="$key"/>Column(), Query::Equals, <xsl:value-of select="$key"/> );
Rex Dieter adf30a
   if ( !qb.exec() ) {
Rex Dieter adf30a
     akDebug() << "Error during selection of record with <xsl:value-of select="$key"/>"
Rex Dieter adf30a
       << <xsl:value-of select="$key"/> << "from table" << tableName()
Rex Dieter adf30a
-- 
Rex Dieter adf30a
2.1.0
Rex Dieter adf30a