/// <summary> /// Executes a query to Kusto for Fields Caps. /// </summary> /// <param name="indexName">Index name.</param> /// <returns>An object with the field caps.</returns> public async Task <FieldCapabilityResponse> GetFieldCapsAsync(string indexName) { var response = new FieldCapabilityResponse(); try { Logger.LogDebug("Getting schema for table '{@indexName}'", indexName); var(databaseName, tableName) = KustoDatabaseTableNames.FromElasticIndexName(indexName, Kusto.DefaultDatabaseName); string kustoCommand = $".show {KustoQLOperators.Databases} {KustoQLOperators.Schema} | {KustoQLOperators.Where} TableName=='{tableName}' {KustoQLOperators.And} DatabaseName=='{databaseName}' {KustoQLOperators.And} ColumnName!='' | {KustoQLOperators.Project} ColumnName, ColumnType"; using IDataReader kustoResults = await Kusto.ExecuteControlCommandAsync(kustoCommand, RequestContext); MapFieldCaps(kustoResults, response); if (response.Fields.Count > 0) { return(response); } Logger.LogDebug("Getting schema for function '{@indexName}'", indexName); string functionQuery = $"{tableName} | {KustoQLOperators.GetSchema} | project ColumnName, ColumnType=DataType"; var functionQueryData = new QueryData(functionQuery, tableName, null, null); var(timeTaken, reader) = await Kusto.ExecuteQueryAsync(functionQueryData, RequestContext); MapFieldCaps(reader, response); } catch (Exception ex) { Logger.LogError(ex, "Error while executing GetFieldCaps."); throw; } return(response); }
private IndexListController GetController() { var mockDAL = new Mock <IKustoDataAccess>(); var response = new FieldCapabilityResponse(); response.AddField(new FieldCapabilityElement { Name = "testFieldName" }); var responseTask = Task.FromResult(response); mockDAL.Setup(kusto => kusto.GetFieldCapsAsync(It.IsNotNull <string>())).Returns(responseTask); mockDAL.Setup(kusto => kusto.GetIndexListAsync(It.IsNotNull <string>())).Returns(Task.FromResult(new IndexListResponseElement() { })); var mockLogger = new Mock <ILogger <IndexListController> >(); var ctr = new IndexListController(mockDAL.Object, mockLogger.Object) { ControllerContext = new ControllerContext() { HttpContext = new DefaultHttpContext(), }, }; const string correlationIdHeader = "x-correlation-id"; ctr.HttpContext.Request.Headers[correlationIdHeader] = Guid.NewGuid().ToString(); return(ctr); }
private void MapFieldCaps(IDataReader kustoResults, FieldCapabilityResponse response) { while (kustoResults.Read()) { var fieldCapabilityElement = FieldCapabilityElementFactory.CreateFromDataRecord(kustoResults); if (string.IsNullOrEmpty(fieldCapabilityElement.Type)) { Logger.LogWarning("Field: {@fieldCapabilityElement} doesn't have a type.", fieldCapabilityElement); } response.AddField(fieldCapabilityElement); Logger.LogDebug("Found field: {@fieldCapabilityElement}", fieldCapabilityElement); } }
public static ISchemaRetrieverFactory CreateMockSchemaRetriever(string name = "dayOfWeek", string type = "string") { var response = new FieldCapabilityResponse(); response.AddField( new FieldCapabilityElement { Name = name, Type = type, }); var responseTask = Task.FromResult(response); var mockDAL = new Mock <IKustoDataAccess>(); mockDAL.Setup(kusto => kusto.GetFieldCapsAsync(It.IsNotNull <string>())).Returns(responseTask); var mockLogger = new Mock <ILogger <SchemaRetriever> >(); return(new SchemaRetrieverFactory(mockLogger.Object, mockDAL.Object)); }