Navigation and service panel


Content

This text is fallbacked from the German Version. If you need use Google Translate


Sitecore Fast Queries nach SQL übersetzen

By Tobias Studer on 3. March 2014, No comments

In manchen Situationen kann es sehr nützlich sein, die SQL Queries zu sehen, welche aus Sitecore Fast Queries generiert werden. Dazu gibt es leider sehr wenige bis keine Informationen im Netz. Dadurch ist der LoquaciousDataProvider entstanden.

Eine englische Version des Beitrags gibt es hier.

Wie sich herausstellt, werden Fast Queries im main-DataProvider nach SQL übersetzt. Mittels eines neuen DataProviders, welcher vom genannten DataProvider erbt, kann die QueryFast(...)-Methode überschrieben und mit zusätzlichen Log-Einträgen ergänzt werden.

protected override IDList QueryFast(string query, CallContext context)
{
    var baseIdList = this.SelectIDs(query, context);
    if (baseIdList != null && baseIdList.Count > 0) return baseIdList;

    var parameters = new ParametersList();
    var sql = this.Translator.TranslateQuery(query, context, parameters);

    Log.Debug(string.Format("FastQuery: {0}", query), this);
    Log.Debug(string.Format("SQL Query: {0}", sql), this);

    if (sql == null) return null;

    var stopwatch = Stopwatch.StartNew();
    using (var reader = this.Api.CreateReader(sql, parameters.ToArray()))
    {
        var idList = new IDList();
        while (reader.Read())
        {
            idList.Add(this.Api.GetId(0, reader));
        }

        context.CurrentResult = idList;
    }

    Log.Debug(string.Format("Query Time: {0}ms", stopwatch.ElapsedMilliseconds), this);
    return null;
}

Dies ergibt bereits einen sehr spannenden Einblick. Jedoch werden leider im SQL noch nicht die aktuellen Werte, sondern die Parameter-Namen ausgegeben. Mit einer zusätzlichen Helper-Methode kann dieser String einfach umgeschrieben werden:

private string FormatSqlQuery(string sql, ParametersList parameterList)
{
    var parameters = parameterList.ToArray();
    for (var i = 0; i < parameters.Length; i = i + 2)
    {
        var parameterName = string.Format("@{0}", parameters[i]);
        var parameterValue = string.Format("'{0}'", parameters[i + 1]);

        sql = sql.Replace(parameterName, parameterValue);
    }

    return sql;
}

Nun werden jedoch sämtliche Fast Queries ausgegeben. Mit einer zusätzlichen Liste von Schlüsselwörtern kann die Ausgabe eingeschränkt werden:

private bool IsTraceEnabled(string query)
{
    return this.Filters.Count == 0 || this.Filters.Any(query.Contains);
}

Die Konfiguration des DataProviders geschieht via Include-File und ersetzt den main-DataProvider. Zusätzlich kann die Liste der gewünschten Schlüsselwörtern über die Konfiguration vorgenommen werden.


  
    
      
$(1)

Die Schlüsselwort-Liste (Filters) verwendet mit dem 'hint="list"'-Attribut eine Sitecore Funktionalität, um Listen mittels Reflection zu laden. Ein solcher Filter kann ein beliebiger String sein, unter anderem auch eine Sitecore ID. Dabei muss man aufpassen, entweder eine Liste mit mindestens einem Element oder dann keine Liste zu konfigurieren. Ansonsten wirft Sitecore eine Exception.

Um die Verwendung möglichst einfach zu machen, gibt es ein NuGet Package. Dieses kann installiert werden und der neue gesprächigere DataProvider ist sofort eingebunden. Das Package beinhaltet eine Version für .NET 4.0, welche gegen Sitecore 6, und eine Version für .NET 4.5, welche gegen Sitecore 7 kompiliert wurde.

Der vollständige Source-Code und weitere Dokumentation befinden sich auf GitHub.

Allfällige Bemerkungen, Verbesserungsvorschläge oder Fragen sind sehr willkommen.

Categories  Modules  Troubleshooting Tags  DataProvider  FastQuery  SQL  Log

No comments

Add your comment

Your email address will not be published. Required fields are marked *

*