private/Read-RawLog.ps1

function Read-RawLog{
    param(
        # Selecting which date type to be analyzed Event or Market.
        [DATATYPE] $datatype,
        [Parameter(Mandatory=$true)]
        # Audit log source file from where the messages will be loaded.
        [SOURCE] $source,
        # Where the appointed marketId should be searched as:
        # * internalId - regular marketId used in the appointed source
        # * externalId - reference for the externalId, the one participated in this log from lower level
        # * typeId - used at some adapters when there is generalization of the marketId's typically as certain blueprint type.
        #
        # Default value is id.
        [SEARCH_SCOPE] $searchScope,
        # Id of the searched scope.
        [string[]] $id = '*',
        # Referent message time taken as baseline from where the messages will be start analyzing.
        [string] $referentTime,
        # Timeframe in which the messages will be analyzed after the referent time.
        [timespan] $timeSpan,
        # Additional tracing details which could be used. For markets all values are allowed: Competitors, Producers, Outcomes and Competitors.
        [TRACE[]] $trace = @(),
        # If the tracing is requested for Outcomes, this could filter down the wanted outcomeId.
        [string] $outcomeId = '*',
        # Aggregate state of the item
        [switch] $aggregate,
        # Displayed progress message
        [string] $progressMessage="Read $source audit log file...",
        # provide the result as native object rather than display one
        [switch] $asObject
    )

    #region Init

    if ([Session]::activeSessions.Count -eq 0){
        Write-Host 'There is no active session. Import audit logs before they are analyzed.' -ForegroundColor Red
        return
    }
    if (-not [Session]::getCurrent().canRead($source)){
        Write-Host 'Background jobs are still active, try later.' -ForegroundColor Red
        return
    }

    $afterDateTime, $beforeDateTime = [DateTimeHelper]::getAfterBefore($referentTime, $timeSpan)
    if ($timeSpan -and -not $referentTime){ $referentTime = (now)}

    $hasReturn = $false
    $traceProducers = ([TRACE]::Producers -in $trace)

    $logFile = [Session]::getCurrent().auditLogFile
    $processor = [ProcessorFactory]::getBySource($source)

    $totalLines = $logFile.AssignFile($source)
    if($referentTime) {
        $count = $logFile.Seek($afterDateTime)
    }
    else {
        $count = 0
    }

    [Message] $prevEventMsg=$null; [Message] $prevMarketMsg=$null; [Message] $prevMsg=$null;

    #endregion

    while (-not $logFile.EOF()){
        $line = $logFile.ReadLine()

        if ($line -and $line.created_at -lt $beforeDateTime){
            $processor.ProcessMessage($line)

            if ($processor.isEventRelated($line)){
                $processor.ProcessEvent($line, $false)

                if ($processor.shouldReprocess -and ($aggregate -and $prevMsg)) {
                    $processor.message.event.Aggregate($prevMsg.event)
                    $processor.Resolve()
                }
                elseif (-not $processor.shouldReprocess -and ($aggregate -and $prevEventMsg)) {
                    $processor.message.event.Aggregate($prevEventMsg.event)
                    $processor.Resolve()
                }

                if ($processor.message) {

                    $prevEventMsg = $processor.message.Copy()
                    $prevMsg = $processor.message.Copy()

                    if ($asObject){
                        Write-Output $prevEventMsg
                    }
                    else {
                        Write-Output $prevEventMsg.EventToOutput($dataType, $traceProducers)
                    }

                    $hasReturn = $true
                }
            }

            if ($dataType -in ([DATATYPE]::Market, [DATATYPE]::Outcome)){ #-and $processor.isMarketRelated($line, $searchScope, $id)
                $processor.ProcessMarket($line, $searchScope, $id, $outcomeId)

                if ($processor.shouldReprocess -and ($aggregate -and $prevMsg)) {
                    $processor.message.event.Aggregate($prevMsg.event)
                    $processor.Resolve()
                }
                elseif (-not $processor.shouldReprocess -and ($aggregate -and $prevMarketMsg)) {
                    $processor.message.event.Aggregate($prevMarketMsg.event)
                    $processor.Resolve()
                }

                if ($processor.message.event.markets.Count -gt 0) {
                    $prevMarketMsg = $processor.message.Copy()
                    $prevMsg = $processor.message.Copy()

                    if ($asObject){
                        Write-Output $prevMarketMsg
                    }
                    else {
                        foreach ($market in $prevMarketMsg.event.markets) {
                            Write-Output $prevMarketMsg.MarketToOutput($dataType, $market, $traceProducers)

                            if ($datatype -eq [DATATYPE]::Outcome){
                                foreach ($outcome in $market.outcomes) {
                                    Write-Output $prevMarketMsg.OutcomeToOutput($dataType, $market, $outcome)
                                }
                            }

                            $hasReturn = $true
                        }
                    }
                }
            }
        }
        else { break }

        $count++
        $percentage = 100 * $logFile.getFilePosition() / $totalLines
        Write-Progress -Activity $progressMessage -PercentComplete $percentage
    }
    Write-Progress -Activity $progressMessage -Completed

    if (-not $hasReturn -and -not $asObject){
        Write-Host 'There is no output for the selected filter(s)!' -ForegroundColor Red
    }
}