/// <summary>
        /// Gets a ResultSet containing all entries sorted by lexical form for a given writing system.
        /// Use "Form" to access the lexical form in a RecordToken.
        /// </summary>
        /// <param name="writingSystemDefinition"></param>
        /// <returns></returns>
        private ResultSet <LexEntry> GetAllEntriesSortedByLexicalForm(WritingSystemDefinition writingSystemDefinition)
        {
            if (writingSystemDefinition == null)
            {
                throw new ArgumentNullException("writingSystemDefinition");
            }
            string cacheName = String.Format("sortedByLexicalForm_{0}", writingSystemDefinition.LanguageTag);

            if (_caches[cacheName] == null)
            {
                var lexicalFormQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    var tokenFieldsAndValues = new Dictionary <string, object>();
                    string headWord          = entryToQuery.LexicalForm[writingSystemDefinition.LanguageTag];
                    if (String.IsNullOrEmpty(headWord))
                    {
                        headWord = null;
                    }
                    tokenFieldsAndValues.Add("Form", headWord);
                    return(new[] { tokenFieldsAndValues });
                });
                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(lexicalFormQuery);

                var sortOrder = new SortDefinition[1];
                sortOrder[0] = new SortDefinition("Form", writingSystemDefinition.DefaultCollation.Collator);

                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, lexicalFormQuery));
            }
            ResultSet <LexEntry> resultsFromCache = _caches[cacheName].GetResultSet();

            return(resultsFromCache);
        }
Beispiel #2
0
        private ResultSet <LexEntry> GetAllEntriesWithMeaningsSortedByLexicalForm(IWritingSystemDefinition lexicalUnitWritingSystem, bool glossMeaningField)
        {
            if (lexicalUnitWritingSystem == null)
            {
                throw new ArgumentNullException("lexicalUnitWritingSystem");
            }
            string cachename = String.Format("MeaningsSortedByLexicalForm_{0}", lexicalUnitWritingSystem);

            if (_caches[cachename] == null)
            {
                DelegateQuery <LexEntry> MatchingMeaningQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entry)
                {
                    List <IDictionary <string, object> > fieldsandValuesForRecordTokens = new List <IDictionary <string, object> >();
                    int senseNumber = 0;
                    foreach (LexSense sense in entry.Senses)
                    {
                        foreach (LanguageForm form in glossMeaningField ? sense.Gloss.Forms : sense.Definition.Forms)
                        {
                            IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                            string lexicalForm = entry.LexicalForm[lexicalUnitWritingSystem.Id];
                            if (String.IsNullOrEmpty(lexicalForm))
                            {
                                lexicalForm = null;
                            }
                            tokenFieldsAndValues.Add("Form", lexicalForm);

                            string meaning = form.Form;
                            if (String.IsNullOrEmpty(meaning))
                            {
                                meaning = null;
                            }
                            tokenFieldsAndValues.Add("Meaning", meaning);

                            string meaningWritingSystem = form.WritingSystemId;
                            if (String.IsNullOrEmpty(meaningWritingSystem))
                            {
                                meaningWritingSystem = null;
                            }
                            tokenFieldsAndValues.Add("MeaningWritingSystem", meaningWritingSystem);
                            tokenFieldsAndValues.Add("SenseNumber", senseNumber);
                            fieldsandValuesForRecordTokens.Add(tokenFieldsAndValues);
                        }
                        senseNumber++;
                    }
                    return(fieldsandValuesForRecordTokens);
                }
                    );
                ResultSet <LexEntry> itemsMatchingQuery = GetItemsMatching(MatchingMeaningQuery);
                SortDefinition[]     sortDefinition     = new SortDefinition[4];
                sortDefinition[0] = new SortDefinition("Form", lexicalUnitWritingSystem.Collator);
                sortDefinition[1] = new SortDefinition("Meaning", StringComparer.InvariantCulture);
                sortDefinition[2] = new SortDefinition("MeaningWritingSystem", StringComparer.InvariantCulture);
                sortDefinition[3] = new SortDefinition("SenseNumber", Comparer <int> .Default);
                ResultSetCache <LexEntry> cache =
                    new ResultSetCache <LexEntry>(this, sortDefinition, itemsMatchingQuery, MatchingMeaningQuery);
                _caches.Add(cachename, cache);
            }
            return(_caches[cachename].GetResultSet());
        }
        /// <summary>
        /// Gets a ResultSet containing all entries sorted by definition and gloss. It will return both the definition
        /// and the gloss if both exist and are different.
        /// Use "Form" to access the Definition/Gloss in RecordToken.
        /// </summary>
        /// <param name="writingSystemDefinition"></param>
        /// <returns>Definition and gloss in "Form" field of RecordToken</returns>
        public ResultSet <LexEntry> GetAllEntriesSortedByDefinitionOrGloss(WritingSystemDefinition writingSystemDefinition)
        {
            if (writingSystemDefinition == null)
            {
                throw new ArgumentNullException("writingSystemDefinition");
            }

            string cacheName = String.Format("SortByDefinition_{0}", writingSystemDefinition.LanguageTag);

            if (_caches[cacheName] == null)
            {
                var definitionQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    var fieldsandValuesForRecordTokens = new List <IDictionary <string, object> >();

                    int senseNumber = 0;
                    foreach (LexSense sense in entryToQuery.Senses)
                    {
                        var rawDefinition = sense.Definition[writingSystemDefinition.LanguageTag];
                        var definitions   = GetTrimmedElementsSeperatedBySemiColon(rawDefinition);

                        var rawGloss = sense.Gloss[writingSystemDefinition.LanguageTag];
                        var glosses  = GetTrimmedElementsSeperatedBySemiColon(rawGloss);

                        var definitionAndGlosses = MergeListsWhileExcludingDoublesAndEmptyStrings(definitions, glosses);


                        if (definitionAndGlosses.Count == 0)
                        {
                            IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                            tokenFieldsAndValues.Add("Form", null);
                            tokenFieldsAndValues.Add("Sense", senseNumber);
                            fieldsandValuesForRecordTokens.Add(tokenFieldsAndValues);
                        }
                        else
                        {
                            foreach (string definition in definitionAndGlosses)
                            {
                                IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                                tokenFieldsAndValues.Add("Form", definition);
                                tokenFieldsAndValues.Add("Sense", senseNumber);
                                fieldsandValuesForRecordTokens.Add(tokenFieldsAndValues);
                            }
                        }

                        senseNumber++;
                    }
                    return(fieldsandValuesForRecordTokens);
                });
                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(definitionQuery);

                var sortOrder = new SortDefinition[2];
                sortOrder[0] = new SortDefinition("Form", writingSystemDefinition.DefaultCollation.Collator);
                sortOrder[1] = new SortDefinition("Sense", Comparer <int> .Default);
                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, definitionQuery));
            }
            return(_caches[cacheName].GetResultSet());
        }
        /// <summary>
        /// Gets a ResultSet containing entries that contain a semantic domain assigned to them
        /// sorted by semantic domain.
        /// Use "SemanticDomain" to access the semantic domain in a RecordToken.
        /// </summary>
        /// <param name="fieldName"></param>
        /// <returns></returns>
        public ResultSet <LexEntry> GetEntriesWithSemanticDomainSortedBySemanticDomain(
            string fieldName)
        {
            if (fieldName == null)
            {
                throw new ArgumentNullException("fieldName");
            }

            string cachename = String.Format("Semanticdomains_{0}", fieldName);

            if (_caches[cachename] == null)
            {
                var semanticDomainsQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entry)
                {
                    var fieldsandValuesForRecordTokens = new List <IDictionary <string, object> >();
                    foreach (LexSense sense in entry.Senses)
                    {
                        foreach (KeyValuePair <string, IPalasoDataObjectProperty> pair in sense.Properties)
                        {
                            if (pair.Key == fieldName)
                            {
                                var semanticDomains = (OptionRefCollection)pair.Value;
                                foreach (string semanticDomain in semanticDomains.Keys)
                                {
                                    IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                                    string domain = semanticDomain;
                                    if (String.IsNullOrEmpty(semanticDomain))
                                    {
                                        domain = null;
                                    }
                                    if (CheckIfTokenHasAlreadyBeenReturnedForThisSemanticDomain(fieldsandValuesForRecordTokens, domain))
                                    {
                                        continue;                                                         //This is to avoid duplicates
                                    }
                                    tokenFieldsAndValues.Add("SemanticDomain", domain);
                                    fieldsandValuesForRecordTokens.Add(tokenFieldsAndValues);
                                }
                            }
                        }
                    }
                    return(fieldsandValuesForRecordTokens);
                }
                    );
                ResultSet <LexEntry> itemsMatchingQuery = GetItemsMatching(semanticDomainsQuery);
                var sortDefinition = new SortDefinition[2];
                sortDefinition[0] = new SortDefinition("SemanticDomain", StringComparer.InvariantCulture);
                sortDefinition[1] = new SortDefinition("Sense", Comparer <int> .Default);
                var cache =
                    new ResultSetCache <LexEntry>(this, sortDefinition, itemsMatchingQuery, semanticDomainsQuery);
                _caches.Add(cachename, cache);
            }
            return(_caches[cachename].GetResultSet());
        }
Beispiel #5
0
        public void TouchAndSaveEntriesFromQuery(DelegateQuery <LexEntry> xrefQuery, string propertyModified)
        {
            ResultSet <LexEntry> all_xref = GetItemsMatching(xrefQuery);

            IList <LexEntry> entries = new List <LexEntry>();;

            foreach (RecordToken <LexEntry> token in all_xref)
            {
                LexEntry entry = token.RealObject;
                entry.SomethingWasModified(propertyModified);
                entries.Add(entry);
            }

            SaveItems(entries);
        }
        /// <summary>
        /// Gets a ResultSet containing all entries sorted by lexical form for a given writing system.
        /// If a lexical form for a given writingsystem does not exist we substitute one from another writingsystem.
        /// Use "Form" to access the lexical form in a RecordToken.
        /// </summary>
        /// <param name="writingSystemDefinition"></param>
        /// <returns></returns>
        public ResultSet <LexEntry> GetAllEntriesSortedByLexicalFormOrAlternative(WritingSystemDefinition writingSystemDefinition)
        {
            if (writingSystemDefinition == null)
            {
                throw new ArgumentNullException("writingSystemDefinition");
            }
            string cacheName = String.Format("sortedByLexicalFormOrAlternative_{0}", writingSystemDefinition.LanguageTag);

            if (_caches[cacheName] == null)
            {
                var lexicalFormWithAlternativeQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                    string lexicalform         = entryToQuery.LexicalForm[writingSystemDefinition.LanguageTag];
                    string writingSystemOfForm = writingSystemDefinition.LanguageTag;
                    if (lexicalform == "")
                    {
                        lexicalform = entryToQuery.LexicalForm.GetBestAlternative(writingSystemDefinition.LanguageTag);
                        foreach (LanguageForm form in entryToQuery.LexicalForm.Forms)
                        {
                            if (form.Form == lexicalform)
                            {
                                writingSystemOfForm = form.WritingSystemId;
                            }
                        }
                        if (lexicalform == "")
                        {
                            lexicalform = null;
                        }
                    }
                    tokenFieldsAndValues.Add("Form", lexicalform);
                    tokenFieldsAndValues.Add("WritingSystem", writingSystemOfForm);
                    return(new[] { tokenFieldsAndValues });
                });
                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(lexicalFormWithAlternativeQuery);

                var sortOrder = new SortDefinition[1];
                sortOrder[0] = new SortDefinition("Form", writingSystemDefinition.DefaultCollation.Collator);

                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, lexicalFormWithAlternativeQuery));
            }
            ResultSet <LexEntry> resultsFromCache = _caches[cacheName].GetResultSet();

            return(resultsFromCache);
        }
Beispiel #7
0
        public ResultSet <LexEntry> GetEntriesWithMissingFieldSortedByLexicalUnit(MissingFieldQuery query, IWritingSystemDefinition lexicalUnitWritingSystem)
        {
            Guard.AgainstNull(lexicalUnitWritingSystem, "lexicalUnitWritingSystem");
            Guard.AgainstNull(query.Field, "field");
            Guard.AgainstNull(query, "query");

            string cacheName = String.Format("missingFieldsSortedByLexicalForm_{0}_{1}_{2}", query.Field, lexicalUnitWritingSystem.Id, query.UniqueCacheId);

            //cacheName = MakeSafeForFileName(cacheName);
            if (_caches[cacheName] == null)
            {
                DelegateQuery <LexEntry> lexicalFormQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                    if (query.FilteringPredicate(entryToQuery))
                    {
                        string lexicalForm = null;
                        if (!String.IsNullOrEmpty(entryToQuery.LexicalForm[lexicalUnitWritingSystem.Id]))
                        {
                            lexicalForm = entryToQuery.LexicalForm[lexicalUnitWritingSystem.Id];
                        }
                        tokenFieldsAndValues.Add("Form", lexicalForm);
                        return(new IDictionary <string, object>[] { tokenFieldsAndValues });
                    }
                    return(new IDictionary <string, object> [0]);
                });
                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(lexicalFormQuery);

                SortDefinition[] sortOrder = new SortDefinition[1];
                sortOrder[0] = new SortDefinition("Form", lexicalUnitWritingSystem.Collator);

                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, lexicalFormQuery));
            }
            ResultSet <LexEntry> resultsFromCache = _caches[cacheName].GetResultSet();

            return(resultsFromCache);
        }
        private ResultSet <LexEntry> GetAllEntriesSortedById()
        {
            string cacheName = String.Format("sortedById");

            if (_caches[cacheName] == null)
            {
                var IdQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                    tokenFieldsAndValues.Add("Id", entryToQuery.Id);
                    return(new[] { tokenFieldsAndValues });
                });
                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(IdQuery);

                var sortOrder = new SortDefinition[1];
                sortOrder[0] = new SortDefinition("Id", Comparer <string> .Default);

                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, IdQuery));
            }
            ResultSet <LexEntry> resultsFromCache = _caches[cacheName].GetResultSet();

            return(resultsFromCache);
        }
        /// <summary>
        /// Gets a ResultSet containing all entries sorted by citation if one exists and otherwise
        /// by lexical form.
        /// Use "Form" to access the headword in a RecordToken.
        /// </summary>
        /// <param name="writingSystemDefinition"></param>
        /// <returns></returns>
        public ResultSet <LexEntry> GetAllEntriesSortedByHeadword(WritingSystemDefinition writingSystemDefinition)
        {
            if (writingSystemDefinition == null)
            {
                throw new ArgumentNullException("writingSystemDefinition");
            }

            string cacheName = String.Format("sortedByHeadWord_{0}", writingSystemDefinition.LanguageTag);

            if (_caches[cacheName] == null)
            {
                var headWordQuery = new DelegateQuery <LexEntry>(
                    delegate(LexEntry entryToQuery)
                {
                    IDictionary <string, object> tokenFieldsAndValues = new Dictionary <string, object>();
                    string headWord = entryToQuery.VirtualHeadWord[writingSystemDefinition.LanguageTag];
                    if (String.IsNullOrEmpty(headWord))
                    {
                        headWord = null;
                    }
                    tokenFieldsAndValues.Add("Form", headWord);
                    return(new[] { tokenFieldsAndValues });
                });

                ResultSet <LexEntry> itemsMatching = _decoratedDataMapper.GetItemsMatching(headWordQuery);
                var sortOrder = new SortDefinition[4];
                sortOrder[0] = new SortDefinition("Form", writingSystemDefinition.DefaultCollation.Collator);
                sortOrder[1] = new SortDefinition("OrderForRoundTripping", Comparer <int> .Default);
                sortOrder[2] = new SortDefinition("OrderInFile", Comparer <int> .Default);
                sortOrder[3] = new SortDefinition("CreationTime", Comparer <DateTime> .Default);

                _caches.Add(cacheName, new ResultSetCache <LexEntry>(this, sortOrder, itemsMatching, headWordQuery));
                // _caches.Add(headWordQuery, /* itemsMatching */ results); // review cp Refactor caches to this signature.
            }
            ResultSet <LexEntry> resultsFromCache = _caches[cacheName].GetResultSet();

            string previousHeadWord = null;
            int    homographNumber  = 1;
            RecordToken <LexEntry> previousToken = null;

            foreach (RecordToken <LexEntry> token in resultsFromCache)
            {
                // A null Form indicates there is no HeadWord in this writing system.
                // However, we need to ensure that we return all entries, so the AtLeastOne in the query
                // above ensures that we keep it in the result set with a null Form and null WritingSystemId.
                var currentHeadWord = (string)token["Form"];
                if (string.IsNullOrEmpty(currentHeadWord))
                {
                    token["HasHomograph"]    = false;
                    token["HomographNumber"] = 0;
                    continue;
                }
                if (currentHeadWord == previousHeadWord)
                {
                    homographNumber++;
                }
                else
                {
                    previousHeadWord = currentHeadWord;
                    homographNumber  = 1;
                }
                // only used to get our sort correct --This comment seems nonsensical --TA 2008-08-14!!!
                token["HomographNumber"] = homographNumber;
                switch (homographNumber)
                {
                case 1:
                    token["HasHomograph"] = false;
                    break;

                case 2:
                    Debug.Assert(previousToken != null);
                    previousToken["HasHomograph"] = true;
                    token["HasHomograph"]         = true;
                    break;

                default:
                    token["HasHomograph"] = true;
                    break;
                }
                previousToken = token;
            }

            return(resultsFromCache);
        }