Skip to content

Commit

Permalink
Merge branch 'release-1.6.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions committed Oct 27, 2021
2 parents 2d94fcc + 14a555e commit 76922cd
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 53 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"oat-sa/oatbox-extension-installer": "~1.1||dev-master",
"ext-json": "*",
"oat-sa/generis": ">=14.2.0",
"oat-sa/tao-core": ">=v48.27.3",
"oat-sa/tao-core": ">=v48.52.0",
"oat-sa/extension-tao-delivery": ">=14.10.1",
"oat-sa/extension-tao-outcomeui": ">=10.4.0",
"oat-sa/lib-tao-elasticsearch": ">=2.2.2"
Expand Down
22 changes: 13 additions & 9 deletions model/Metadata/Listener/ClassMovedListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
use oat\oatbox\service\ConfigurableService;
use oat\tao\model\event\ClassMovedEvent;
use oat\taoAdvancedSearch\model\Index\Listener\ListenerInterface;
use oat\taoAdvancedSearch\model\Index\Service\IndexerInterface;
use oat\taoAdvancedSearch\model\Index\Normalizer\NormalizerInterface;
use oat\taoAdvancedSearch\model\Index\Service\ResultIndexer;
use oat\taoAdvancedSearch\model\Metadata\Normalizer\MetadataNormalizer;

Expand All @@ -44,18 +44,22 @@ public function listen($event): void

$subClasses = $event->getClass()->getSubClasses(true);

$indexer = $this->getIndexer();
$indexer->setNormalizer($this->getNormalizer());


foreach (array_merge([$event->getClass()], $subClasses) as $class) {
$this->getIndexer()->addIndex($class);
$indexer->addIndex($class);
}
}

private function getIndexer(): IndexerInterface
private function getIndexer(): ResultIndexer
{
return $this->getServiceLocator()->get(ResultIndexer::class);
}

private function getNormalizer(): NormalizerInterface
{
/** @var ResultIndexer $indexer */
$indexer = $this->getServiceLocator()->get(ResultIndexer::class);
$indexer->setNormalizer(
$this->getServiceLocator()->get(MetadataNormalizer::class)
);
return $indexer;
return $this->getServiceLocator()->get(MetadataNormalizer::class);
}
}
1 change: 1 addition & 0 deletions model/Metadata/Normalizer/MetadataNormalizer.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ private function getPropertiesFromClass(core_kernel_classes_Class $class): array
$propertyCollection[] = [
'propertyUri' => $property->getPropertyUri(),
'propertyLabel' => $property->getLabel(),
'propertyAlias' => $property->getAlias(),
'propertyType' => $property->getType(),
'propertyValues' => null,
];
Expand Down
81 changes: 58 additions & 23 deletions model/Metadata/Service/ClassMetadataSearcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

namespace oat\taoAdvancedSearch\model\Metadata\Service;

use oat\generis\model\OntologyAwareTrait;
use oat\oatbox\service\ConfigurableService;
use oat\tao\elasticsearch\ElasticSearch;
use oat\tao\elasticsearch\Query;
Expand All @@ -41,17 +42,14 @@ class ClassMetadataSearcher extends ConfigurableService implements ClassMetadata
{
private const BASE_LIST_ITEMS_URI = '/tao/PropertyValues/get?propertyUri=%s';

/** @var array */
private $processedClasses = [];
use OntologyAwareTrait;

public function findAll(ClassMetadataSearchInput $input): ClassCollection
{
if ($this->getAdvancedSearchChecker()->isEnabled()) {
$currentClassUri = $input->getSearchRequest()->getClassUri();

$this->addProcessedClass($currentClassUri, $this->getProperties($currentClassUri));

return new ClassCollection(...array_values($this->processedClasses));
return $this->createClassCollection($currentClassUri, $this->getProperties($currentClassUri));
}

return $this->getClassMetadataSearcher()->findAll($input);
Expand Down Expand Up @@ -144,31 +142,68 @@ private function filterDuplicatedProperties(array $allProperties): array
return $properties;
}

private function addProcessedClass(string $classUri, array $properties)
private function createClassCollection(string $classUri, array $properties): ClassCollection
{
$metadataCollection = new MetadataCollection();

$duplicatedUris = $this->getDuplicatedPropertyUris($properties);

foreach ($properties as $property) {
$metadataCollection->addMetadata(
(new Metadata())
->setLabel($property['propertyLabel'])
->setPropertyUri($property['propertyUri'])
->setUri(
$this->getPropertyListUri(
$property['propertyUri'],
$property['propertyType'],
$property['propertyValues']
)
$relatedClass = $this->getProperty($property['propertyUri'])->getRelatedClass();

$metadata = (new Metadata())
->setLabel($property['propertyLabel'])
->setAlias($property['propertyAlias'])
->setClassLabel($relatedClass ? $relatedClass->getLabel() : null)
->setPropertyUri($property['propertyUri'])
->setType($property['propertyType'])
->setValues($property['propertyValues'])
->setUri(
$this->getPropertyListUri(
$property['propertyUri'],
$property['propertyType'],
$property['propertyValues']
)
->setType($property['propertyType'])
->setValues($property['propertyValues'])
);
);

if (in_array($property['propertyUri'], $duplicatedUris, true)) {
$metadata->markAsDuplicated();
}

$metadataCollection->addMetadata($metadata);
}

return new ClassCollection(
(new ClassMetadata())
->setClass($classUri)
->setLabel($this->getClass($classUri)->getLabel())
->setMetaData($metadataCollection)
);
}

private function getDuplicatedPropertyUris(array $properties): array
{
$duplicatedGroups = [];

foreach ($properties as $property) {
$unifiedLabel = trim(strtolower($property['propertyLabel']));

if (!array_key_exists($unifiedLabel, $duplicatedGroups)) {
$duplicatedGroups[$unifiedLabel] = [];
}

$duplicatedGroups[$unifiedLabel][] = $property['propertyUri'];
}

$duplicated = [];

foreach ($duplicatedGroups as $group) {
if (count($group) > 1) {
$duplicated = array_merge($duplicated, $group);
}
}

$this->processedClasses[$classUri] = (new ClassMetadata())
->setClass($classUri)
->setLabel($classUri)
->setMetaData($metadataCollection);
return $duplicated;
}

private function executeQuery(string $field, string $value): ResultSet
Expand Down
38 changes: 22 additions & 16 deletions tests/Unit/Metadata/Listener/ClassMovedListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,25 +38,25 @@ class ClassMovedListenerTest extends TestCase
private $subject;

/** @var ResultIndexer|MockObject */
private $resultIndexerMock;
private $resultIndexer;

/** @var MetadataNormalizer|MockObject */
private $metadataNormalizerMock;
private $metadataNormalizer;

/** @var ClassMovedEvent|MockObject */
private $eventMock;
private $event;

public function setUp(): void
{
$this->subject = new ClassMovedListener();
$this->resultIndexerMock = $this->createMock(ResultIndexer::class);
$this->metadataNormalizerMock = $this->createMock(MetadataNormalizer::class);
$this->eventMock = $this->createMock(ClassMovedEvent::class);
$this->resultIndexer = $this->createMock(ResultIndexer::class);
$this->metadataNormalizer = $this->createMock(MetadataNormalizer::class);
$this->event = $this->createMock(ClassMovedEvent::class);
$this->subject->setServiceLocator(
$this->getServiceLocatorMock(
[
ResultIndexer::class => $this->resultIndexerMock,
MetadataNormalizer::class => $this->metadataNormalizerMock
ResultIndexer::class => $this->resultIndexer,
MetadataNormalizer::class => $this->metadataNormalizer
]
)
);
Expand All @@ -65,24 +65,30 @@ public function setUp(): void
public function testListenThrowExceptionOnWrongEvent(): void
{
$this->expectException(UnsupportedEventException::class);

$this->subject->listen($this->createMock(Event::class));
}

public function testListen()
{
$classMock = $this->createMock(core_kernel_classes_Class::class);
$class = $this->createMock(core_kernel_classes_Class::class);
$subClass = $this->createMock(core_kernel_classes_Class::class);

$this->eventMock
->expects($this->once())
$class->method('getSubClasses')
->willReturn([$subClass]);

$this->event
->method('getClass')
->willReturn( $classMock);
->willReturn( $class);

$this->resultIndexerMock
$this->resultIndexer
->expects($this->once())
->method('setNormalizer');

$this->subject->listen(
$this->eventMock
);
$this->resultIndexer
->expects($this->exactly(2))
->method('addIndex');

$this->subject->listen($this->event);
}
}
5 changes: 5 additions & 0 deletions tests/Unit/Metadata/Normalizer/MetadataNormalizerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,10 @@ public function testNormalize(
->method('getLabel')
->willReturn('Label Example');

$this->metadataMock
->method('getAlias')
->willReturn('Alias Example');

$this->metadataMock
->method('getType')
->willReturn('Type Example');
Expand Down Expand Up @@ -183,6 +187,7 @@ public function testNormalize(
[
'propertyUri' => 'PropertyUri Example',
'propertyLabel' => 'Label Example',
'propertyAlias' => 'Alias Example',
'propertyType' => 'Type Example',
'propertyValues' => $getValuesResult
]
Expand Down
25 changes: 24 additions & 1 deletion tests/Unit/Metadata/Service/ClassMetadataSearcherTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

namespace oat\taoAdvancedSearch\tests\Unit\model\Metadata\Service;

use core_kernel_classes_Property;
use oat\generis\model\data\Ontology;
use oat\generis\test\TestCase;
use oat\oatbox\log\LoggerService;
use oat\tao\elasticsearch\ElasticSearch;
Expand Down Expand Up @@ -52,11 +54,15 @@ class ClassMetadataSearcherTest extends TestCase
/** @var SearchProxy|MockObject */
private $search;

/** @var Ontology|MockObject */
private $ontology;

public function setUp(): void
{
$this->classMetadataService = $this->createMock(ClassMetadataService::class);
$this->advancedSearchChecker = $this->createMock(AdvancedSearchChecker::class);
$this->elasticSearch = $this->createMock(ElasticSearch::class);
$this->ontology = $this->createMock(Ontology::class);
$this->search = $this->createMock(SearchProxy::class);
$this->search
->method('getAdvancedSearch')
Expand All @@ -69,7 +75,8 @@ public function setUp(): void
ClassMetadataService::SERVICE_ID => $this->classMetadataService,
AdvancedSearchChecker::class => $this->advancedSearchChecker,
SearchProxy::SERVICE_ID => $this->search,
LoggerService::SERVICE_ID => $this->createMock(LoggerService::class)
LoggerService::SERVICE_ID => $this->createMock(LoggerService::class),
Ontology::SERVICE_ID => $this->ontology
]
)
);
Expand Down Expand Up @@ -98,6 +105,22 @@ public function testFindAllWhenAdvancedSearchIsDisabledWillFallbackToGeneris():

public function testFindAllUsingElasticSearch(): void
{
$property = $this->createMock(core_kernel_classes_Property::class);
$property->method('getRelatedClass')
->willReturn(null);

$class = $this->createMock(core_kernel_classes_Property::class);
$class->method('getLabel')
->willReturn('Class label');

$this->ontology
->method('getProperty')
->willReturn($property);

$this->ontology
->method('getClass')
->willReturn($class);

$this->advancedSearchChecker
->method('isEnabled')
->willReturn(true);
Expand Down
5 changes: 2 additions & 3 deletions tests/Unit/Resource/Service/SyncResourceResultIndexerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,12 @@

use core_kernel_classes_Resource;
use oat\generis\test\TestCase;
use oat\oatbox\log\LoggerService;
use oat\tao\model\search\index\DocumentBuilder\IndexDocumentBuilderInterface;
use oat\tao\model\search\index\IndexDocument;
use oat\tao\model\search\index\IndexService;
use oat\tao\model\search\SearchInterface;
use oat\tao\model\search\SearchProxy;
use oat\tao\model\task\migration\ResultUnit;
use oat\taoAdvancedSearch\model\Index\IndexResource;
use oat\taoAdvancedSearch\model\Index\Service\ResultIndexer;
use oat\taoAdvancedSearch\model\Resource\Service\SyncResourceResultIndexer;
use PHPUnit\Framework\MockObject\MockObject;

Expand Down Expand Up @@ -62,6 +60,7 @@ public function setUp(): void
IndexService::SERVICE_ID => $this->indexerService,
SearchProxy::SERVICE_ID => $this->search,
IndexDocumentBuilderInterface::class => $this->indexDocumentBuilder,
LoggerService::SERVICE_ID => $this->createMock(LoggerService::class),
]
)
);
Expand Down

0 comments on commit 76922cd

Please sign in to comment.