hanaim-devops / PriemChecker

0 stars 0 forks source link

Een PriemCheckerMetSnelheidsMeting maken (decorator pattern) #7

Open bartvanderwal opened 4 weeks ago

bartvanderwal commented 4 weeks ago

Die weer een decorator pattern gebruikt om zijn _innerChecker de echt check te laten doet, maar (als decoratie) de tijd meet in milliseconden dat het bepalen erover doet. Zodat we dit ook kunnen teruggeven en opslaan. Kun je de code van (alleen) zo'n StopWatch stukje geven om de call naar de innerchecker heen (in C#)?

-->

using System;
using System.Diagnostics;

public class TimedPriemChecker : IPriemChecker
{
    private readonly IPriemChecker _innerChecker;

    public TimedPriemChecker(IPriemChecker innerChecker)
    {
        _innerChecker = innerChecker;
    }

    public bool IsPriemgetal(int number)
    {
        // Start de stopwatch
        Stopwatch stopwatch = Stopwatch.StartNew();

        // Roep de innerlijke priemchecker aan
        bool isPrime = _innerChecker.IsPriemgetal(number);

        // Stop de stopwatch en meet de verstreken tijd
        stopwatch.Stop();
        Console.WriteLine($"Priemgetal check voor {number} duurde {stopwatch.ElapsedMilliseconds} ms");

        return isPrime;
    }
}

Na overleg met ChatGPT noem ik deze TimedPriemChecker nu NL: PriemCheckerMetSnelheidsMeting

want over dat laatse vind ik dan wel niets in de README ervan o.i.d. maar deze term die ook op Wikipedia staat komt wel in de codebase voor: https://github.com/Open-NET-Libraries/Open.Numeric.Primes/blob/master/source/MillerRabin.cs

bartvanderwal commented 4 weeks ago

Ik wil dit 'aantalSecondenOmTeBereken' ook opslaan in de database, samen met het starttijdstip van de berekening (tijd én datum in UTC) om op te slaan in de database. Dit moet de MemoizingPriemChecker dan doen. Die moet als innerChecker de PriemCheckerMetSnelheidsMeting krijgen.

Ik heb de volgende code, maar hoe bepaal je de huidige DateTime, op de regel waar achter de = nog iets moet komen?

// Anders de interne service gebruiken om te berekenen.
        var result = _innerService.IsPriemgetal(number);

        var huidigeDateTime = ;
        // Resultaat opslaan in database
        _context.PriemCheckResultaten.Add(new PriemCheckResultaatEntity(
            number,
            result.IsPriemgetal,
            result.AantalLoops,
            result.AantalSecondenOmTeBerekenen,
            huidigeDateTime,
            ));
        _context.SaveChanges();
bartvanderwal commented 4 weeks ago

Ik heb nu subtaak 1 gedaan, en laat rename voor 2 nog even zitten maar:

Bij het uitvoeren van dotnet ef migrations add krijg ik echter een error op de BigInteger.

Toelichting/TLDR

Ik wil upgraden voor priemchecks en dus voor PriemCheckResultaat waarden, ook in de database van 'int' (ingeger) naar een BigInteger. Maar bij runnen dotnet ef migrations add PriemCheckResultaatBigIntVoorKandidaatEnMeerMetaData krijg ik een error dat EF Core helemaal geen BigIntegers ondersteunt. Zie foutmelding onder.

Unable to create a 'DbContext' of type 'PriemChecker.Persistence.PriemCheckContext'. The exception 'The 'BigInteger' property 'PriemCheckResultaatEntity.PriemKandidaatWaarde' could not be mapped because the database provider does not support this type. Consider converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728

Kortom:

Unable to create a 'DbContext' of type 'PriemChecker.