Microsoft.Azure.Cosmos/src/Query/Core/Metrics/ServerSideMetricsTokenizer.cs (207 lines of code) (raw):
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace Microsoft.Azure.Cosmos.Query.Core.Metrics
{
using System;
using System.Text;
/// <summary>
/// Tokenizer for <see cref="ServerSideMetricsInternal"/>
/// </summary>
#if INTERNAL
#pragma warning disable SA1600
#pragma warning disable CS1591
#pragma warning disable SA1602 // Enumeration items should be documented
public
#else
internal
#endif
static class ServerSideMetricsTokenizer
{
public enum TokenType
{
DocumentLoadTimeInMs,
WriteOutputTimeInMs,
IndexUtilizationRatio,
IndexLookupTimeInMs,
QueryLogicalPlanBuildTimeInMs,
OutputDocumentCount,
OutputDocumentSize,
QueryPhysicalPlanBuildTimeInMs,
QueryCompileTimeInMs,
QueryOptimizationTimeInMs,
RetrievedDocumentCount,
RetrievedDocumentSize,
SystemFunctionExecuteTimeInMs,
TotalExecutionTimeInMs,
UserFunctionExecuteTimeInMs,
VMExecutionTimeInMs,
EqualsDelimiter,
SemiColonDelimiter,
NumberToken,
}
public static class TokenBuffers
{
public static readonly ReadOnlyMemory<byte> DocumentLoadTimeInMs = Encoding.UTF8.GetBytes("documentLoadTimeInMs");
public static readonly ReadOnlyMemory<byte> WriteOutputTimeInMs = Encoding.UTF8.GetBytes("writeOutputTimeInMs");
public static readonly ReadOnlyMemory<byte> IndexUtilizationRatio = Encoding.UTF8.GetBytes("indexUtilizationRatio");
public static readonly ReadOnlyMemory<byte> IndexLookupTimeInMs = Encoding.UTF8.GetBytes("indexLookupTimeInMs");
public static readonly ReadOnlyMemory<byte> QueryLogicalPlanBuildTimeInMs = Encoding.UTF8.GetBytes("queryLogicalPlanBuildTimeInMs");
public static readonly ReadOnlyMemory<byte> OutputDocumentCount = Encoding.UTF8.GetBytes("outputDocumentCount");
public static readonly ReadOnlyMemory<byte> OutputDocumentSize = Encoding.UTF8.GetBytes("outputDocumentSize");
public static readonly ReadOnlyMemory<byte> QueryPhysicalPlanBuildTimeInMs = Encoding.UTF8.GetBytes("queryPhysicalPlanBuildTimeInMs");
public static readonly ReadOnlyMemory<byte> QueryCompileTimeInMs = Encoding.UTF8.GetBytes("queryCompileTimeInMs");
public static readonly ReadOnlyMemory<byte> QueryOptimizationTimeInMs = Encoding.UTF8.GetBytes("queryOptimizationTimeInMs");
public static readonly ReadOnlyMemory<byte> RetrievedDocumentCount = Encoding.UTF8.GetBytes("retrievedDocumentCount");
public static readonly ReadOnlyMemory<byte> RetrievedDocumentSize = Encoding.UTF8.GetBytes("retrievedDocumentSize");
public static readonly ReadOnlyMemory<byte> SystemFunctionExecuteTimeInMs = Encoding.UTF8.GetBytes("systemFunctionExecuteTimeInMs");
public static readonly ReadOnlyMemory<byte> TotalExecutionTimeInMs = Encoding.UTF8.GetBytes("totalExecutionTimeInMs");
public static readonly ReadOnlyMemory<byte> UserFunctionExecuteTimeInMs = Encoding.UTF8.GetBytes("userFunctionExecuteTimeInMs");
public static readonly ReadOnlyMemory<byte> VMExecutionTimeInMs = Encoding.UTF8.GetBytes("VMExecutionTimeInMs");
}
public static (TokenType? tokenType, ReadOnlyMemory<byte> buffer) Read(ReadOnlySpan<byte> corpus)
{
if (corpus[0] == '=')
{
return (TokenType.EqualsDelimiter, default);
}
else if (corpus[0] == ';')
{
return (TokenType.SemiColonDelimiter, default);
}
else if (char.IsDigit((char)corpus[0]))
{
return (TokenType.NumberToken, default);
}
else
{
// Check to see if it's a property name token
int index = corpus.IndexOf((byte)'=');
if (index == -1)
{
return (default, default);
}
return GetTokenType(corpus.Slice(start: 0, length: index));
}
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenType(ReadOnlySpan<byte> buffer)
{
switch (buffer.Length)
{
case 20:
return GetTokenTypeLength20(buffer);
case 19:
return GetTokenTypeLength19(buffer);
case 21:
return GetTokenTypeLength21(buffer);
case 29:
return GetTokenTypeLength29(buffer);
case 18:
return GetTokenTypeLength18(buffer);
case 30:
return GetTokenTypeLength30(buffer);
case 25:
return GetTokenTypeLength25(buffer);
case 22:
return GetTokenTypeLength22(buffer);
case 27:
return GetTokenTypeLength27(buffer);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength20(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.DocumentLoadTimeInMs.Span))
{
return (TokenType.DocumentLoadTimeInMs, TokenBuffers.DocumentLoadTimeInMs);
}
if (buffer.SequenceEqual(TokenBuffers.QueryCompileTimeInMs.Span))
{
return (TokenType.QueryCompileTimeInMs, TokenBuffers.QueryCompileTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength19(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.WriteOutputTimeInMs.Span))
{
return (TokenType.WriteOutputTimeInMs, TokenBuffers.WriteOutputTimeInMs);
}
if (buffer.SequenceEqual(TokenBuffers.IndexLookupTimeInMs.Span))
{
return (TokenType.IndexLookupTimeInMs, TokenBuffers.IndexLookupTimeInMs);
}
if (buffer.SequenceEqual(TokenBuffers.OutputDocumentCount.Span))
{
return (TokenType.OutputDocumentCount, TokenBuffers.OutputDocumentCount);
}
if (buffer.SequenceEqual(TokenBuffers.VMExecutionTimeInMs.Span))
{
return (TokenType.VMExecutionTimeInMs, TokenBuffers.VMExecutionTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength21(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.IndexUtilizationRatio.Span))
{
return (TokenType.IndexUtilizationRatio, TokenBuffers.IndexUtilizationRatio);
}
if (buffer.SequenceEqual(TokenBuffers.RetrievedDocumentSize.Span))
{
return (TokenType.RetrievedDocumentSize, TokenBuffers.RetrievedDocumentSize);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength29(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.QueryLogicalPlanBuildTimeInMs.Span))
{
return (TokenType.QueryLogicalPlanBuildTimeInMs, TokenBuffers.QueryLogicalPlanBuildTimeInMs);
}
if (buffer.SequenceEqual(TokenBuffers.SystemFunctionExecuteTimeInMs.Span))
{
return (TokenType.SystemFunctionExecuteTimeInMs, TokenBuffers.SystemFunctionExecuteTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength18(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.OutputDocumentSize.Span))
{
return (TokenType.OutputDocumentSize, TokenBuffers.OutputDocumentSize);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength30(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.QueryPhysicalPlanBuildTimeInMs.Span))
{
return (TokenType.QueryPhysicalPlanBuildTimeInMs, TokenBuffers.QueryPhysicalPlanBuildTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength25(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.QueryOptimizationTimeInMs.Span))
{
return (TokenType.QueryOptimizationTimeInMs, TokenBuffers.QueryOptimizationTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength22(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.RetrievedDocumentCount.Span))
{
return (TokenType.RetrievedDocumentCount, TokenBuffers.RetrievedDocumentCount);
}
if (buffer.SequenceEqual(TokenBuffers.TotalExecutionTimeInMs.Span))
{
return (TokenType.TotalExecutionTimeInMs, TokenBuffers.TotalExecutionTimeInMs);
}
return (default, default);
}
private static (TokenType? tokenType, ReadOnlyMemory<byte> tokenBuffer) GetTokenTypeLength27(ReadOnlySpan<byte> buffer)
{
if (buffer.SequenceEqual(TokenBuffers.UserFunctionExecuteTimeInMs.Span))
{
return (TokenType.UserFunctionExecuteTimeInMs, TokenBuffers.UserFunctionExecuteTimeInMs);
}
return (default, default);
}
}
}