private static BackgroundVerificationService CreateVerificationService( IBackgroundVerificationInputs backgroundVerificationInputs, ConcurrentBag <IssueMsg> issueCollection, Action <VerificationResponse> writeAction, ITrackCancel trackCancel) { var qaService = new BackgroundVerificationService( backgroundVerificationInputs.DomainTransactions, backgroundVerificationInputs.DatasetLookup) { CustomErrorFilter = backgroundVerificationInputs.CustomErrorFilter }; var currentProgress = new VerificationProgressMsg(); qaService.IssueFound += (sender, args) => issueCollection.Add(CreateIssueProto(args, backgroundVerificationInputs)); qaService.Progress += (sender, args) => SendProgress( sender, args, issueCollection, currentProgress, writeAction, trackCancel); return(qaService); }
public BackgroundVerificationService( [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs) : this(backgroundVerificationInputs.DomainTransactions, backgroundVerificationInputs.DatasetLookup) { CustomErrorFilter = backgroundVerificationInputs.CustomErrorFilter; }
private QualitySpecification PrepareQualitySpecificationTx( IBackgroundVerificationInputs backgroundVerificationInputs) { QualitySpecification qualitySpecification = backgroundVerificationInputs.QualitySpecification.Match( qs => qualitySpecification = qs, lbqs => { qualitySpecification = lbqs.QualitySpecification; SetLocationBasedQualitySpecification(lbqs); return(qualitySpecification); }); if (DistributedTestRunner != null) { DistributedTestRunner.QualitySpecification = qualitySpecification; } // Not needed as long as VerifyEditableDatasets() is used: //if (backgroundVerificationInputs.VerifiedDatasets != null) //{ // DisableUninvolvedConditions( // qualitySpecification, backgroundVerificationInputs.VerifiedDatasets); //} InitializeTestParameterValuesTx(qualitySpecification, _domainTransactions); return(qualitySpecification); }
public QualityVerification Verify( [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs, [CanBeNull] ITrackCancel trackCancel) { QualitySpecification qualitySpecification = null; _backgroundVerificationInputs = backgroundVerificationInputs; _domainTransactions.UseTransaction( delegate { backgroundVerificationInputs.LoadInputsTx( _domainTransactions, trackCancel, OnProgress); qualitySpecification = PrepareQualitySpecificationTx(backgroundVerificationInputs); }); IVerificationContext verificationContext = Assert.NotNull(backgroundVerificationInputs.VerificationContext); VerificationServiceParameters parameters = Assert.NotNull(backgroundVerificationInputs.VerificationParameters); QualityVerification verification = Verify( verificationContext, qualitySpecification, parameters, backgroundVerificationInputs.VerifiedObjects); if (parameters.SaveVerificationStatistics && !verification.Cancelled) { backgroundVerificationInputs.SaveVerification(verification, _domainTransactions); } return(verification); }
private ServiceCallStatus VerifyQualityCore( VerificationRequest request, IServerStreamWriter <VerificationResponse> responseStream, ITrackCancel trackCancel) { SetupUserNameProvider(request); void SendResponse(VerificationResponse r) => responseStream.WriteAsync(r); BackgroundVerificationService qaService = null; List <GdbObjRefMsg> deletableAllowedErrorRefs = new List <GdbObjRefMsg>(); QualityVerification verification = null; var issueCollection = new ConcurrentBag <IssueMsg>(); string cancellationMessage = null; try { // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from // short-term objects (request) -> add to background verification inputs IBackgroundVerificationInputs backgroundVerificationInputs = _verificationInputsFactoryMethod(request); qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection, SendResponse, trackCancel); int maxParallelRequested = request.MaxParallelProcessing; if (backgroundVerificationInputs.WorkerClient != null && maxParallelRequested > 1) { // allow directly adding issues found by client processes: qaService.DistributedTestRunner = new DistributedTestRunner( backgroundVerificationInputs.WorkerClient, request, issueCollection); } verification = qaService.Verify(backgroundVerificationInputs, trackCancel); deletableAllowedErrorRefs.AddRange( GetDeletableAllowedErrorRefs(request.Parameters, qaService)); } catch (Exception e) { _msg.Error($"Error checking quality for request {request}", e); cancellationMessage = $"Server error: {e.Message}"; if (!EnvironmentUtils.GetBooleanEnvironmentVariableValue( "PROSUITE_QA_SERVER_KEEP_SERVING_ON_ERROR")) { SetUnhealthy(); } } ServiceCallStatus result = SendFinalResponse( verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection, deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse); return(result); }
private static IssueMsg CreateIssueProto( [NotNull] IssueFoundEventArgs args, [NotNull] IBackgroundVerificationInputs backgroundVerificationInputs) { QualityCondition qualityCondition = args.QualitySpecificationElement.QualityCondition; IssueMsg issueProto = new IssueMsg(); issueProto.ConditionId = qualityCondition.Id; issueProto.Allowable = args.IsAllowable; issueProto.StopCondition = args.Issue.StopCondition; CallbackUtils.DoWithNonNull( args.Issue.Description, s => issueProto.Description = s); IssueCode issueCode = args.Issue.IssueCode; if (issueCode != null) { CallbackUtils.DoWithNonNull( issueCode.ID, s => issueProto.IssueCodeId = s); CallbackUtils.DoWithNonNull( issueCode.Description, s => issueProto.IssueCodeDescription = s); } CallbackUtils.DoWithNonNull( args.Issue.AffectedComponent, (value) => issueProto.AffectedComponent = value); issueProto.InvolvedTables.AddRange(GetInvolvedTableMessages(args.Issue.InvolvedTables)); CallbackUtils.DoWithNonNull( args.LegacyInvolvedObjectsString, (value) => issueProto.LegacyInvolvedRows = value); IVerificationContext verificationContext = Assert.NotNull(backgroundVerificationInputs.VerificationContext); var supportedGeometryTypes = GetSupportedErrorRepoGeometryTypes(verificationContext).ToList(); // create valid Error geometry (geometry type, min dimensions) if possible IGeometry geometry = ErrorRepositoryUtils.GetGeometryToStore( args.ErrorGeometry, verificationContext.SpatialReferenceDescriptor.SpatialReference, supportedGeometryTypes); issueProto.IssueGeometry = ProtobufGeometryUtils.ToShapeMsg(geometry); // NOTE: Multipatches are not restored from byte arrays in EsriShape (10.6.1) ShapeMsg.FormatOneofCase format = geometry?.GeometryType == esriGeometryType.esriGeometryMultiPatch ? ShapeMsg.FormatOneofCase.Wkb : ShapeMsg.FormatOneofCase.EsriShape; issueProto.IssueGeometry = ProtobufGeometryUtils.ToShapeMsg(geometry, format); issueProto.CreationDateTimeTicks = DateTime.Now.Ticks; //issueProto.IsInvalidException = args.us; //if (args.IsAllowed) //{ // issueProto.ExceptedObjRef = new GdbObjRefMsg() // { // ClassHandle = args.AllowedErrorRef.ClassId, // ObjectId = args.AllowedErrorRef.ObjectId // }; //} return(issueProto); }
private ServiceCallStatus VerifyDataQualityCore( [NotNull] DataVerificationRequest initialRequest, Func <DataVerificationResponse, DataVerificationRequest> moreDataRequest, IServerStreamWriter <DataVerificationResponse> responseStream, ITrackCancel trackCancel) { var request = initialRequest.Request; SetupUserNameProvider(request); void SendResponse(VerificationResponse r) => responseStream.WriteAsync( new DataVerificationResponse { Response = r }); BackgroundVerificationService qaService = null; List <GdbObjRefMsg> deletableAllowedErrorRefs = new List <GdbObjRefMsg>(); QualityVerification verification = null; var issueCollection = new ConcurrentBag <IssueMsg>(); string cancellationMessage = null; try { // TODO: Separate long-lived objects, such as datasetLookup, domainTransactions (add to this class) from // short-term objects (request) -> add to background verification inputs IBackgroundVerificationInputs backgroundVerificationInputs = _verificationInputsFactoryMethod(request); if (initialRequest.Schema != null) { backgroundVerificationInputs.SetGdbSchema( ProtobufConversionUtils.CreateSchema(initialRequest.Schema.ClassDefinitions, initialRequest .Schema.RelclassDefinitions, moreDataRequest)); } else if (moreDataRequest != null) { backgroundVerificationInputs.SetRemoteDataAccess(moreDataRequest); } qaService = CreateVerificationService(backgroundVerificationInputs, issueCollection, SendResponse, trackCancel); verification = qaService.Verify(backgroundVerificationInputs, trackCancel); deletableAllowedErrorRefs.AddRange( GetDeletableAllowedErrorRefs(request.Parameters, qaService)); } catch (Exception e) { _msg.Error($"Error checking quality for request {request}", e); cancellationMessage = $"Server error: {e.Message}"; SetUnhealthy(); } ServiceCallStatus result = SendFinalResponse( verification, cancellationMessage ?? qaService.CancellationMessage, issueCollection, deletableAllowedErrorRefs, qaService?.VerifiedPerimeter, SendResponse); return(result); }