private void BuildWordLayersOf(WordElementBuilder wordBuilder, UnifiedNode wordResult)
 {
     wordBuilder.ExpletiveSubjectSpecified = wordResult.ExpletiveSubject != null;
     if (wordBuilder.ExpletiveSubjectSpecified)
     {
         wordBuilder.ExpletiveSubject = (bool)wordResult.ExpletiveSubject;
     }
     wordBuilder.ProperSpecified = wordResult.Proper != null;
     if (wordBuilder.ProperSpecified)
     {
         wordBuilder.Proper = (bool)wordResult.Proper;
     }
     wordBuilder.InflectionSpecified = wordResult.Inflection != null;
     if (wordBuilder.InflectionSpecified)
     {
         wordBuilder.Inflection = (inflection)wordResult.Inflection;
     }
     wordBuilder.CannedSpecified = wordResult.Canned != null;
     if (wordBuilder.CannedSpecified)
     {
         wordBuilder.Canned = (bool)wordResult.Canned;
     }
     switch (wordBuilder)
     {
     case PronounBuilder pronounBuilder:
         BuildPronounLayerOf(pronounBuilder, wordResult);
         break;
     }
 }
        private void UpdateWordLayersFor(WordElementBuilder wordBuilder)
        {
            LayerWord dbSavedWordLayer;
            bool      isNewLayerWord;
            LayerWord existingWordLayer = LayerWords.FirstOrDefault(wordLayer => wordLayer.ID.Equals(wordBuilder.FlexDB_ID));

            if (existingWordLayer != null)
            {
                isNewLayerWord   = false;
                dbSavedWordLayer = existingWordLayer;
            }
            else
            {
                isNewLayerWord   = true;
                dbSavedWordLayer = new LayerWord(wordBuilder.FlexDB_ID, FlexData.Word.TypeOf(wordBuilder));
                LayerWords.InsertOnSubmit(dbSavedWordLayer);
            }
            dbSavedWordLayer.ExpletiveSubject = wordBuilder.ExpletiveSubjectSpecified ? wordBuilder.ExpletiveSubject : null;
            dbSavedWordLayer.Proper           = wordBuilder.ProperSpecified ? wordBuilder.Proper : null;
            dbSavedWordLayer.Inflection       = wordBuilder.InflectionSpecified ? (byte)wordBuilder.Inflection : null;
            dbSavedWordLayer.Canned           = wordBuilder.CannedSpecified ? wordBuilder.Canned : null;
            UpdateWeightedWordsFor(wordBuilder, dbSavedWordLayer, isNewLayerWord);
            UpdateLayerWord(dbSavedWordLayer);
            switch (wordBuilder)
            {
            case PronounBuilder pronoun:
                UpdatePronounLayerFor(pronoun);
                break;

            default: break;
            }
        }
        private WordElementBuilder BuildWord(UnifiedNode wordResult, IEnumerable <GetWeightedWordsForTreeResult> weightedWordResultsForThisBuilder)
        {
            WordElementBuilder wordBuilder = FlexData.Word.BuilderOfType((FlexData.WordType)wordResult.WordType);

            wordBuilder.FlexDB_ID = (int)wordResult.ID;
            BuildWordLayersOf(wordBuilder, wordResult);
            if (weightedWordResultsForThisBuilder.Count().Equals(1))
            {
                wordBuilder.WordSource = new SingleWordSource(weightedWordResultsForThisBuilder.Single().Text);
            }
            else
            {
                GetWeightedWordsForTreeResult defaultWeightedWordResult = weightedWordResultsForThisBuilder.Single(weightedWordResult => wordResult.DefaultWeightedWord.Equals(weightedWordResult.ID));
                WeightedWord defaultWeightedWord = new WeightedWord(defaultWeightedWordResult.Text, defaultWeightedWordResult.Weight);
                IEnumerable <WeightedWord> alternateWeightedWords = weightedWordResultsForThisBuilder
                                                                    .Where(weightedWordResult => weightedWordResult != defaultWeightedWordResult)
                                                                    .Select(weightedWordResult => new WeightedWord(weightedWordResult.Text, weightedWordResult.Weight));
                wordBuilder.WordSource = new WordSelector(defaultWeightedWord, alternateWeightedWords);
            }
            return(wordBuilder);
        }
        //private IQueryable<WordElementBuilder> LoadAllWords() => DB_Elements
        //    .Where(dbElement => dbElement.ElementType.Equals(FlexData.ElementType.DB_Word))
        //    .Select(dbBuilder => LoadWord(dbBuilder.ID));

        //private WordElementBuilder LoadWord(int wordBuilder_ID)
        //{
        //    WordElementBuilder wordBuilder;
        //    DB_Word dbWord = DB_Words.Single(element => element.ID.Equals(wordBuilder_ID));
        //    wordBuilder = FlexData.Word.BuilderOfType((FlexData.WordType)dbWord.WordType);
        //    wordBuilder.FlexDB_ID = wordBuilder_ID;
        //    LoadWordLayersOf(wordBuilder);
        //    Task.Run(() =>
        //    {
        //        WeightedWord defaultWeightedWord = DB_WeightedWords
        //            .Where(dbWeightedWord => dbWeightedWord.WordElement.Equals(wordBuilder_ID) && dbWord.DefaultWeightedWord.Equals(dbWeightedWord.ID))
        //            .Select(dbWeightedWord => new WeightedWord(dbWeightedWord.Text, dbWeightedWord.Weight))
        //            .Single();
        //        IEnumerable<WeightedWord> alternates = DB_WeightedWords
        //            .Where(dbWeightedWord => dbWeightedWord.WordElement.Equals(wordBuilder_ID) && !dbWord.DefaultWeightedWord.Equals(dbWeightedWord.ID))
        //            .Select(dbWeightedWord => new WeightedWord(dbWeightedWord.Text, dbWeightedWord.Weight));
        //        if (alternates.Count().Equals(0))
        //            wordBuilder.WordSource = new SingleWordSource(defaultWeightedWord.Text);
        //        else
        //            wordBuilder.WordSource = new WordSelector(defaultWeightedWord, alternates);
        //    });
        //    return wordBuilder;
        //}

        //private void LoadWordLayersOf(WordElementBuilder wordBuilder)
        //{
        //    LayerWord wordLayer = LayerWords.Single(wordLayer => wordLayer.ID.Equals(wordBuilder.FlexDB_ID));
        //    wordBuilder.ExpletiveSubjectSpecified = wordLayer.ExpletiveSubject != null;
        //    if (wordBuilder.ExpletiveSubjectSpecified) wordBuilder.ExpletiveSubject = (bool)wordLayer.ExpletiveSubject;
        //    wordBuilder.ProperSpecified = wordLayer.Proper != null;
        //    if (wordBuilder.ProperSpecified) wordBuilder.Proper = (bool)wordLayer.Proper;
        //    wordBuilder.InflectionSpecified = wordLayer.Inflection != null;
        //    if (wordBuilder.InflectionSpecified) wordBuilder.Inflection = (inflection)wordLayer.Inflection;
        //    wordBuilder.CannedSpecified = wordLayer.Canned != null;
        //    if (wordBuilder.CannedSpecified) wordBuilder.Canned = (bool)wordLayer.Canned;
        //    switch (wordBuilder)
        //    {
        //        case PronounBuilder pronounBuilder:
        //            LoadPronounLayerOf(pronounBuilder);
        //            break;
        //    }
        //}

        //private void LoadPronounLayerOf(PronounBuilder pronounBuilder)
        //{
        //    LayerPronoun pronounLayer = LayerPronouns.Single(pronounLayer => pronounLayer.ID.Equals(pronounBuilder.FlexDB_ID));
        //    pronounBuilder.CaseSpecified = pronounLayer.PronounCase != null;
        //    if (pronounBuilder.CaseSpecified) pronounBuilder.Case = (PronounCase)pronounLayer.PronounCase;
        //    pronounBuilder.PersonSpecified = pronounLayer.Person != null;
        //    if (pronounBuilder.PersonSpecified) pronounBuilder.Person = (person)pronounLayer.Person;
        //    pronounBuilder.NumberSpecified = pronounLayer.Number != null;
        //    if (pronounBuilder.NumberSpecified) pronounBuilder.Number = (numberAgreement)pronounLayer.Number;
        //    pronounBuilder.GenderSpecified = pronounLayer.Gender != null;
        //    if (pronounBuilder.GenderSpecified) pronounBuilder.Gender = (gender)pronounLayer.Gender;
        //}

        private void SaveWord(WordElementBuilder wordBuilder)
        {
            DB_Element dbSavedElement;
            bool       isNewDB_Element = wordBuilder.FlexDB_ID == 0;

            // If the word doesn't support variations, and we've already saved a matching DB_Word in the database, don't save another one
            if (!wordBuilder.SupportsVariations)
            {
                DB_Word existingDB_WordThatMatches = DB_Words
                                                     .Where(dbWord => dbWord.WordType.Equals(FlexData.Word.TypeOf(wordBuilder)))
                                                     .FirstOrDefault(wordElement => wordElement.DefaultForm.Equals(wordBuilder.WordSource.DefaultWord));
                if (existingDB_WordThatMatches != null)
                {
                    wordBuilder.FlexDB_ID = existingDB_WordThatMatches.ID;
                    return;
                }
            }
            // Make sure we have a WordElementBuilder with a valid FlexDB_ID.
            // We'll need that FlexDB_ID so DB_WeightedWords can refer to it when we save them in the database.
            if (isNewDB_Element)        // The word builder does not already exist in the database.  We need to insert it so it has an ID.
            {
                dbSavedElement            = new DB_Element(FlexData.ElementType.DB_Word);
                dbSavedElement.FormsCount = wordBuilder.CountForms();
                DB_Elements.InsertOnSubmit(dbSavedElement);
                SubmitChanges();
                // Now we have the ID available from the database.  Assign the ID to the in-memory object, so we'll remember it's not new if we update it
                wordBuilder.FlexDB_ID = dbSavedElement.ID;
            }
            else  // The word builder already exists in the database
            {
                dbSavedElement            = DB_Elements.Single(dbElement => dbElement.ID.Equals(wordBuilder.FlexDB_ID));
                dbSavedElement.FormsCount = wordBuilder.CountForms();
            }
            UpdateWordLayersFor(wordBuilder);
            SubmitChanges();
            OnWordChanged(wordBuilder.FlexDB_ID);
        }
 internal WordContentVertex(WordElementBuilder web) => Model = web;
        private void UpdateWeightedWordsFor(WordElementBuilder wordBuilder, LayerWord wordLayer, bool isNewLayerWord)
        {
            // The DB_WeightedWords that are already in the database belonging to this word
            IEnumerable <DB_WeightedWord> existingWeightedWordsForThisBuilder = DB_WeightedWords
                                                                                .Where(dbWeightedWord => dbWeightedWord.WordElement.Equals(wordBuilder.FlexDB_ID));

            switch (wordBuilder.WordSource)
            {
            case SingleWordSource sws:
                // If a WordElementBuilder has only a single word form, then in-memory its WordSource is a SingleWordSource.
                DB_WeightedWord existingDefaultWeightedWord = existingWeightedWordsForThisBuilder
                                                              .FirstOrDefault(dbWeightedWord => dbWeightedWord.Text.Equals(sws.GetWord()));
                DB_WeightedWord dbSavedDefaultWeightedWord;
                if (existingDefaultWeightedWord == null)
                {
                    dbSavedDefaultWeightedWord = new DB_WeightedWord
                    {
                        WordElement = wordBuilder.FlexDB_ID,
                        Text        = sws.GetWord()
                    };
                    DB_WeightedWords.InsertOnSubmit(dbSavedDefaultWeightedWord);
                    SubmitChanges();
                }
                else
                {
                    dbSavedDefaultWeightedWord      = existingDefaultWeightedWord;
                    dbSavedDefaultWeightedWord.Text = sws.GetWord();
                    UpdateDB_WeightedWord(dbSavedDefaultWeightedWord);
                }
                wordLayer.DefaultWeightedWord = dbSavedDefaultWeightedWord.ID;
                DB_WeightedWords.DeleteAllOnSubmit(existingWeightedWordsForThisBuilder
                                                   .Where(dbWeightedWord => dbWeightedWord != dbSavedDefaultWeightedWord));
                break;

            case WordSelector ws:
                if (isNewLayerWord)
                {
                    DB_WeightedWords.InsertAllOnSubmit(ws.GetWeightedWordVariations()
                                                       .Select(wsVariation => new DB_WeightedWord
                    {
                        WordElement = wordBuilder.FlexDB_ID,
                        Text        = wsVariation.Text,
                        Weight      = wsVariation.Weight
                    }));
                    SubmitChanges();
                    // Now that the newly inserted DB_WeightedWords have their IDs assigned, we can figure out which ID to make the Builder's DefaultForm.
                    // If a WordElementBuilder has multiple word forms, then in-memory its WordSource is a WordSelector.
                    // In this case we store it to the database as a collection of DB_WeightedWord that refer to the DB_WordBuilder, and the DB_WordBuilder
                    // has a reference to ONE of those.  The DB_WordBuilder has its SingleWord set to null because it has multiple word forms.
                    wordLayer.DefaultWeightedWord = DB_WeightedWords
                                                    .Single(dbWeightedWord => dbWeightedWord.WordElement.Equals(wordBuilder.FlexDB_ID) && dbWeightedWord.Text.Equals(ws.Default.Text))
                                                    .ID;
                }
                else      // We're updating a DB_WordBuilder that's already in the database
                {
                    DB_WeightedWords.DeleteAllOnSubmit(existingWeightedWordsForThisBuilder
                                                       .Where(dbWeightedWord => !ws.GetWeightedWordVariations().Any(variation => variation.Text.Equals(dbWeightedWord.Text))));
                    IEnumerable <DB_WeightedWord> existingWeightedWordsToUpdate = existingWeightedWordsForThisBuilder
                                                                                  .Join(ws.GetWeightedWordVariations(),
                                                                                        existingDBWeightedWord => existingDBWeightedWord.Text,
                                                                                        wsVariation => wsVariation.Text,
                                                                                        (existingDBWeightedWord, wsVariation) => existingDBWeightedWord)
                                                                                  .Where(existingDBWeightedWord => existingDBWeightedWord.Weight != ws.WeightOf(existingDBWeightedWord.Text));
                    // Update weights for existing DB_WeightedWords, in case the user changed them in the UI
                    foreach (DB_WeightedWord eachWeightedWordToUpdate in existingWeightedWordsToUpdate)
                    {
                        eachWeightedWordToUpdate.Weight = ws.GetWeightedWordVariations()
                                                          .Single(wsVariation => wsVariation.Text.Equals(eachWeightedWordToUpdate.Text))
                                                          .Weight;
                    }
                    // New DB_WeightedWords corresponding to words that are NOT already in the database, but ARE present in the WordSelector that we're saving
                    IEnumerable <DB_WeightedWord> newWeightedWordsToInsert = ws.GetWeightedWordVariations()
                                                                             .Where(wsVariation => !existingWeightedWordsForThisBuilder.Any(dbWeightedWord => dbWeightedWord.Text.Equals(wsVariation.Text)))
                                                                             .Select(wsVariation => new DB_WeightedWord
                    {
                        WordElement = wordBuilder.FlexDB_ID,
                        Text        = wsVariation.Text,
                        Weight      = wsVariation.Weight
                    });
                    DB_WeightedWords.InsertAllOnSubmit(newWeightedWordsToInsert);
                    SubmitChanges();      // After doing this, we have valid IDs for the DB_WeightedWords
                    // Now update the DB_WordBuilder.  Since the in-memory WordElementBuilder has a WordSelector as its WordSource, the database form needs
                    // to have DefaultForm set, and SingleWord NOT set.
                    wordLayer.DefaultWeightedWord = existingWeightedWordsForThisBuilder.Concat(newWeightedWordsToInsert)
                                                    .Single(dbWeightedWord => dbWeightedWord.WordElement == wordBuilder.FlexDB_ID && dbWeightedWord.Text.Equals(ws.Default.Text))
                                                    .ID;
                }
                break;

            default: break;
            }
        }
 internal Enumerator(WordElementBuilder word)
 {
     Builder        = word;
     WordVariations = Builder.WordSource.GetStringVariationsEnumerator();
 }
Exemple #8
0
 internal WordPartOfSpeechVertex(WordElementBuilder web) => Model = web;
 internal Variations(WordElementBuilder word) => Builder = word;
Exemple #10
0
 internal static string LabelFor(WordElementBuilder element) => element switch
 {
Exemple #11
0
 public static WordType TypeOf(WordElementBuilder word) => BuilderTypeToWordType[word.GetType()];
 internal WordContentVertex WordContentVertexFor(WordElementBuilder partOfSpeech) => WordContents.Single(vertex => vertex.Model == partOfSpeech);
Exemple #13
0
 public WordBuilderViewModel(WordElementBuilder builder)
 {
     Builder = builder;
     Choices = WordChoicesFor(Builder);
     Pivot   = Builder.WordSource.DefaultWord;
 }
 /// <summary>Return a new view model object for <paramref name="builder"/></summary>
 internal static ElementProperties For(WordElementBuilder builder) => builder switch
 {