/// <summary> /// Create query /// </summary> /// <param name="model"></param> public ApplicationRecordQueryApiModel(ApplicationRecordQueryModel model) { ApplicationName = model.ApplicationName; ApplicationUri = model.ApplicationUri; ApplicationType = model.ApplicationType; ProductUri = model.ProductUri; ServerCapabilities = model.ServerCapabilities; MaxRecordsToReturn = model.MaxRecordsToReturn; StartingRecordId = model.StartingRecordId; }
/// <inheritdoc/> public Task <ApplicationRecordListModel> QueryApplicationsAsync( ApplicationRecordQueryModel query, CancellationToken ct) { return(_database.QueryApplicationsAsync(query, ct)); }
/// <inheritdoc/> public async Task <ApplicationRecordListModel> QueryApplicationsAsync( ApplicationRecordQueryModel request, CancellationToken ct) { // TODO: implement last query time var lastCounterResetTime = DateTime.MinValue; var records = new List <ApplicationDocument>(); var matchQuery = false; var complexQuery = !string.IsNullOrEmpty(request.ApplicationName) || !string.IsNullOrEmpty(request.ApplicationUri) || !string.IsNullOrEmpty(request.ProductUri) || (request.ServerCapabilities != null && request.ServerCapabilities.Count > 0); if (complexQuery) { matchQuery = Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern( request.ApplicationName) || Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern( request.ApplicationUri) || Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.IsMatchPattern( request.ProductUri); } var nextRecordId = request.StartingRecordId ?? 0; var maxRecordsToReturn = request.MaxRecordsToReturn ?? 0; var lastQuery = false; do { var queryRecords = complexQuery ? kDefaultRecordsPerQuery : maxRecordsToReturn; var query = CreateServerQuery(nextRecordId, (int)queryRecords); nextRecordId++; var applications = await query.ReadAsync(); lastQuery = queryRecords == 0 || applications.Count() < queryRecords; foreach (var application in applications.Select(a => a.Value)) { nextRecordId = application.ID + 1; if (!string.IsNullOrEmpty(request.ApplicationName)) { if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match( application.ApplicationName, request.ApplicationName)) { continue; } } if (!string.IsNullOrEmpty(request.ApplicationUri)) { if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match( application.ApplicationUri, request.ApplicationUri)) { continue; } } if (!string.IsNullOrEmpty(request.ProductUri)) { if (!Opc.Ua.Gds.Server.Database.ApplicationsDatabaseBase.Match( application.ProductUri, request.ProductUri)) { continue; } } string[] capabilities = null; if (!string.IsNullOrEmpty(application.ServerCapabilities)) { capabilities = application.ServerCapabilities.Split(','); } if (request.ServerCapabilities != null && request.ServerCapabilities.Count > 0) { var match = true; foreach (var cap in request.ServerCapabilities) { if (capabilities == null || !capabilities.Contains(cap)) { match = false; break; } } if (!match) { continue; } } records.Add(application); if (maxRecordsToReturn > 0 && --maxRecordsToReturn == 0) { break; } } } while (maxRecordsToReturn > 0 && !lastQuery); if (lastQuery) { nextRecordId = 0; } return(new ApplicationRecordListModel { Applications = records.Select(a => new ApplicationRecordModel { Application = a.ToServiceModel(), RecordId = a.ID }).ToList(), LastCounterResetTime = lastCounterResetTime, NextRecordId = nextRecordId }); }