/**
  * Analyze a lexicon project and create Sense, Example and Picture guids. Remove id from Sense and Example
  * @param LexProjectModelForUseWithSenseGuidMigration $project
  * @param string $projectId
  * @param string $testMode
  */
 private static function analyzeProject($project, $projectId, $testMode)
 {
     $entryModifiedCount = 0;
     $exampleModifiedCount = 0;
     $pictureModifiedCount = 0;
     $entryList = LexEntryCommands::listEntries($projectId);
     foreach ($entryList->entries as $entryListItem) {
         $entry = new LexEntryModel($project, $entryListItem['id']);
         $entryModified = false;
         if ($entry->hasSenses()) {
             /** @var LexSense $sense */
             foreach ($entry->senses as $sense) {
                 self::createSenseGuids($sense, $entryModified, $exampleModifiedCount, $pictureModifiedCount);
             }
             if ($entryModified) {
                 $entryModifiedCount++;
             }
             if (!$testMode) {
                 $entry->write();
             }
         }
     }
     if (!$testMode) {
         $project->hasHadSenseGuidsMigrated = true;
         $project->write();
     }
     print "{$exampleModifiedCount} example and {$pictureModifiedCount} picture guids created.\n";
     print "{$entryModifiedCount} of {$entryList->count} entries had sense guids created.\n";
 }
 /**
  * Analyze a lexicon project and migrate the semantic domain keys in the senses
  * @param ProjectModelForUseWithSemanticDomainMigration $project
  * @param string $projectId
  * @param string $testMode
  * @param string $message
  */
 private function analyzeProject($project, $projectId, $testMode, &$message)
 {
     $entryModifiedCount = 0;
     $entryList = LexEntryCommands::listEntries($projectId);
     foreach ($entryList->entries as $entryListItem) {
         $entry = new LexEntryModel($project, $entryListItem['id']);
         $entryModified = false;
         if ($entry->hasSenses()) {
             /** @var LexSense $sense */
             foreach ($entry->senses as $sense) {
                 $this->migrateSemDomKey($sense, $project->projectName, $message, $entryModified);
             }
         }
         if ($entryModified) {
             $entryModifiedCount++;
             if (!$testMode) {
                 $entry->write();
             }
         }
     }
     if (!$testMode) {
         $project->hasMigratedSemanticDomainKeys = true;
         $project->write();
     }
     if ($entryModifiedCount > 0) {
         print "{$entryModifiedCount} entries with semantic domains were migrated\n";
     }
 }
 /**
  * Analyze a lexicon project and migrate MultiParagraph data structure and config
  * @param LexProjectModelForUseWithMultiParagraphMigration $project
  * @param string $testMode
  */
 private static function analyzeProject($project, $testMode)
 {
     $entryModifiedCount = 0;
     $multiParagraphCount = 0;
     $senseModifiedCount = 0;
     $exampleModifiedCount = 0;
     $entryList = LexEntryCommands::listEntries($project->id->asString());
     foreach ($entryList->entries as $entryListItem) {
         $entryModified = false;
         $entryConfig = $project->config->entry;
         $senseConfig = $entryConfig->fields['senses'];
         $exampleConfig = $senseConfig->fields['examples'];
         $entry = new LexEntryModel($project, $entryListItem['id']);
         self::migrateMultiParagraphs($entry, $entryConfig, $multiParagraphCount, $entryModified);
         if ($entry->hasSenses()) {
             /** @var LexSense $sense */
             foreach ($entry->senses as $sense) {
                 $senseModified = false;
                 self::migrateMultiParagraphs($sense, $senseConfig, $multiParagraphCount, $senseModified);
                 if (isset($sense->examples)) {
                     /** @var LexExample $example */
                     foreach ($sense->examples as $example) {
                         $exampleModified = false;
                         self::migrateMultiParagraphs($example, $exampleConfig, $multiParagraphCount, $exampleModified);
                         if ($exampleModified) {
                             $entryModified = true;
                             $senseModified = true;
                             $exampleModifiedCount++;
                         }
                     }
                 }
                 if ($senseModified) {
                     $entryModified = true;
                     $senseModifiedCount++;
                 }
             }
         }
         if ($entryModified) {
             $entryModifiedCount++;
             if (!$testMode) {
                 $entry->write();
             }
         }
     }
     if (!$testMode) {
         $project->hasHadMultiParagraphsMigrated = true;
         $project->write();
     }
     print "{$multiParagraphCount} multi paragraphs found.\n";
     print "{$senseModifiedCount} senses and {$exampleModifiedCount} examples modified.\n";
     print "{$entryModifiedCount} of {$entryList->count} entries had multi paragraphs.\n";
 }
 public function testListEntries_someEntriesWithNoDefinition_Ok()
 {
     $e = new LexiconMongoTestEnvironment();
     $e->clean();
     $project = $e->createProject(SF_TESTPROJECT, SF_TESTPROJECTCODE);
     $projectId = $project->id->asString();
     for ($i = 0; $i < 10; $i++) {
         $entry = new LexEntryModel($project);
         $entry->lexeme->form('th', 'Apfel' . $i);
         if ($i % 2 == 0) {
             $sense = new Sense();
             $entry->senses[] = $sense;
         }
         if ($i % 3 == 0) {
             $sense = new Sense();
             $sense->definition->form('en', 'apple');
             $sense->partOfSpeech->value = 'noun';
             $entry->senses[] = $sense;
         }
         $entry->write();
     }
     $result = LexEntryCommands::listEntries($projectId);
     $this->assertEqual($result->entries[0]['lexeme']['th']['value'], 'Apfel0');
     $this->assertTrue(!array_key_exists('definition', $result->entries[0]['senses'][0]));
     $this->assertEqual($result->entries[3]['senses'][0]['definition']['en']['value'], 'apple');
 }