/// <summary> /// Krijg de basislijst. Dus alle set namen. /// En indien gewenst ook de inhoud van de 'common' set. /// </summary> private IList <IZoekresultaat> ZoekBasisDatabaseLijst(ZoekRestricties zoekRestricties) { var alleDatabases = Enumerable.Empty <IZoekresultaat>(); // zoekrestricties toepassen if (zoekRestricties.ZoekInBijbel && !zoekRestricties.ZoekInLiederen) { alleDatabases = _databaseZoek.KrijgAlleSetNamenInBijbelDb(); } else if (!zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen) { alleDatabases = _databaseZoek.KrijgAlleSetNamenInNormaleDb(); } else if (zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen) { alleDatabases = _databaseZoek.KrijgAlleSetNamen(); } // Alle slide templates zoals amen, votum, bidden etc) if (zoekRestricties.ZoekInCommon) { alleDatabases = alleDatabases.Concat(_databaseZoek.KrijgAlleFragmentenUitNormaleDb(FileEngineDefaults.CommonFilesSetName)); } return(alleDatabases.ToList()); }
private IList <IZoekresultaat> ZoekFragmenten(ZoekRestricties zoekRestricties, string setNaam) { var alleFragmenten = Enumerable.Empty <IZoekresultaat>(); // zoekrestricties toepassen if (zoekRestricties.ZoekInBijbel && !zoekRestricties.ZoekInLiederen) { alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitBijbelDb(setNaam); } else if (!zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen) { alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitNormaleDb(setNaam); } else if (zoekRestricties.ZoekInBijbel && zoekRestricties.ZoekInLiederen) { alleFragmenten = _databaseZoek.KrijgAlleFragmentenUitAlleDatabases(setNaam); } return(alleFragmenten.ToList()); }
private IEnumerable <IVrijZoekresultaatMogelijkheid> KrijgBasisDatabaseLijst(ZoekRestricties zoekRestricties, bool cached) { if (!cached) { return(ZoekBasisDatabaseLijst(zoekRestricties) .Select(t => new ZoekresultaatItem() { Weergave = t.Resultaat.Weergave, VeiligeNaam = t.Resultaat.VeiligeNaam, UitDatabase = t.Database.Weergave, }) .Distinct().ToList()); } else { if (_onderdelenLijstCache == null || !zoekRestricties.Equals(_onderdelenLijstRestrictiesCache)) { _onderdelenLijstCache = KrijgBasisDatabaseLijst(zoekRestricties, false); _onderdelenLijstRestrictiesCache = zoekRestricties; } return(_onderdelenLijstCache); } }
/// <summary> /// Dit maakt een lijst van resultaten die voldoen aan de zoektekst. Filteren gebeurd hier niet maar in de UI zelf. /// We helpen de UX beleving door de UI niet direct alle mogelijkheden meteen terug te geven, alleen te verdiepen waar de gebruiker /// echt naar zoekt. /// Verder wordt aangegeven welke zoekresultaten veranderd zijn zodat de UI de verwijderde of toegevoegde elementen kan animeren /// of iets dergelijks. /// </summary> public IVrijZoekresultaat VrijZoeken(string zoekTekst, bool alsBijbeltekst = false, IVrijZoekresultaat vorigResultaat = null) { var veiligeZoekTekst = (zoekTekst ?? "").TrimStart(); var veranderingGemaakt = vorigResultaat == null; var zoekRestricties = new ZoekRestricties(alsBijbeltekst); var aanname = vorigResultaat?.Aanname; var laatsteZoektekenIsFragmentWissel = veiligeZoekTekst.Length > 0 ? LiturgieInterpretator.LiturgieTekstNaarObject.BenamingDeelScheidingstekens.Contains(veiligeZoekTekst.Last()) : false; var onderdeelLijst = KrijgBasisDatabaseLijst(zoekRestricties, true); var fragmentLijst = Enumerable.Empty <IVrijZoekresultaatMogelijkheid>(); var vorigeZoektermSplit = _liturgieTekstNaarObject.VanTekstregel(vorigResultaat == null ? "" : vorigResultaat.ZoekTerm); var huidigeZoektermSplit = _liturgieTekstNaarObject.VanTekstregel(veiligeZoekTekst); // Wisselen tussen bijbeltekst vinkje of niet geeft natuurlijk grote wijziging if (vorigResultaat != null && vorigResultaat.AlsBijbeltekst != alsBijbeltekst) { veranderingGemaakt = true; } // Let op: Omdat de UI zelf filtert detecteren we hier alleen overgangen. // Kijk of er in de zoektekst een spatie is gebruikt, dan komt er nu een overgang aan if ((veiligeZoekTekst.Length > 0 && laatsteZoektekenIsFragmentWissel) || (string.IsNullOrWhiteSpace(vorigeZoektermSplit.Deel) && !string.IsNullOrWhiteSpace(huidigeZoektermSplit.Deel))) { // Fragment is er bij gekomen veranderingGemaakt = true; fragmentLijst = ZoekFragmenten(zoekRestricties, huidigeZoektermSplit.Benaming).Select(t => new ZoekresultaatItem() { Weergave = $"{huidigeZoektermSplit.Benaming} {t.Resultaat.Weergave}", UitDatabase = t.Database.Weergave, }).ToList(); // Geen aannames meer aanname = null; } // Zo gauw je de spatie weghaald is de overgang weer weg else if ((veiligeZoekTekst.Length == 0 || !laatsteZoektekenIsFragmentWissel) && string.IsNullOrWhiteSpace(huidigeZoektermSplit.Deel) && (vorigResultaat != null && vorigResultaat.ZoekTerm.Length > 0 && LiturgieInterpretator.LiturgieTekstNaarObject.BenamingDeelScheidingstekens.Contains(vorigResultaat.ZoekTerm.Last()))) { // Fragment is weer weg gehaald veranderingGemaakt = true; } // Bepaal het nieuwe zoekresultaat var nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt); if (vorigResultaat == null) { return(nieuwResultaat); } // Het kan zijn dat bij het vorige zoekresultaat nog meerdere opties mogelijk waren, maar dat er nu nog maar 1 optie mogelijk is, // terwijl je nog wel een paar tekens moet typen. Dat kan handiger, we maken de aanname dat je deze ene optie bedoelt: if (!laatsteZoektekenIsFragmentWissel && vorigResultaat.Aanname == null && VoorspelZoekresultaat(vorigResultaat.AlleMogelijkheden, vorigResultaat.ZoekTerm).Count() > 1 && VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).Count() == 1) { veranderingGemaakt = true; aanname = VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).First().Weergave; // Fragment toevoegen op basis van aanname fragmentLijst = ZoekFragmenten(zoekRestricties, aanname).Select(t => new ZoekresultaatItem() { Weergave = $"{aanname} {t.Resultaat.Weergave}", UitDatabase = t.Database.Weergave, }).ToList(); nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt); } // Als de aanname niet meer gemaakt kan worden else if (!string.IsNullOrEmpty(vorigResultaat.Aanname) && VoorspelZoekresultaat(nieuwResultaat.AlleMogelijkheden, nieuwResultaat.ZoekTerm).Count() > VoorspelZoekresultaat(vorigResultaat.AlleMogelijkheden, vorigResultaat.ZoekTerm).Count()) { veranderingGemaakt = true; aanname = null; nieuwResultaat = ZoekresultaatSamenstellen(veiligeZoekTekst, alsBijbeltekst, vorigResultaat, onderdeelLijst.Union(fragmentLijst), aanname, veranderingGemaakt); } return(nieuwResultaat); }