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