Skip to content

Commit dec661a

Browse files
committed
Compatibility for creating index in es 24
1 parent 2f169a5 commit dec661a

7 files changed

Lines changed: 221 additions & 8 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"php": ">=7.4",
2828
"ext-json": "*",
2929
"ext-curl": "*",
30-
"spameri/elastic-query": "v1.0.0-alpha.8",
30+
"spameri/elastic-query": "v1.0.0-alpha.9",
3131
"elasticsearch/elasticsearch": "^2.4.0 || ^7.12.0",
3232
"nette/di": "^2.4.17 || ^3.0",
3333
"nette/utils": "^2.5.7 || ^3.0",

src/Model/EntitySettingsLocator.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ public function locate(string $indexName): \Spameri\ElasticQuery\Mapping\Setting
3030
}
3131

3232

33+
/**
34+
* @return \Generator<\Spameri\Elastic\Settings\IndexConfigInterface>
35+
*/
3336
public function locateAll(): \Generator
3437
{
35-
/** @var array<\Spameri\Elastic\Settings\IndexConfigInterface> $settings */
3638
$serviceNames = $this->container->findByType(\Spameri\Elastic\Settings\IndexConfigInterface::class);
3739
foreach ($serviceNames as $serviceName) {
3840
yield $this->container->getService($serviceName);

src/Model/Indices/Create.php

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@
55
class Create
66
{
77

8-
/**
9-
* @var \Spameri\Elastic\ClientProvider
10-
*/
11-
private $clientProvider;
8+
private \Spameri\Elastic\ClientProvider $clientProvider;
9+
10+
private \Spameri\Elastic\Model\VersionProvider $versionProvider;
1211

1312

1413
public function __construct(
15-
\Spameri\Elastic\ClientProvider $clientProvider
14+
\Spameri\Elastic\ClientProvider $clientProvider,
15+
\Spameri\Elastic\Model\VersionProvider $versionProvider
1616
)
1717
{
1818
$this->clientProvider = $clientProvider;
19+
$this->versionProvider = $versionProvider;
1920
}
2021

2122

@@ -28,6 +29,19 @@ public function execute(
2829
array $parameters
2930
): array
3031
{
32+
if (
33+
isset($parameters['mappings']['properties'])
34+
&& $this->versionProvider->provide() <= \Spameri\ElasticQuery\Response\Result\Version::ELASTIC_VERSION_ID_7
35+
) {
36+
foreach ($parameters['mappings']['properties'] as $fieldName => $field) {
37+
$this->replaceKeywordInOlderVersion($field);
38+
$parameters['mappings']['properties'][$fieldName] = $field;
39+
}
40+
$parameters['mappings'] = [
41+
$index => $parameters['mappings'],
42+
];
43+
}
44+
3145
try {
3246
return $this->clientProvider->client()->indices()->create(
3347
(
@@ -44,4 +58,37 @@ public function execute(
4458
}
4559
}
4660

61+
62+
public function replaceKeywordInOlderVersion(array &$field): void
63+
{
64+
if (isset($field['properties'])) {
65+
foreach ($field['properties'] as $propertyKey => $propertyField) {
66+
$this->replaceKeywordInOlderVersion($propertyField);
67+
$field['properties'][$propertyKey] = $propertyField;
68+
}
69+
}
70+
71+
if (isset($field['fields'])) {
72+
foreach ($field['fields'] as $fieldKey => $subField) {
73+
$this->replaceKeywordInOlderVersion($subField);
74+
$field['fields'][$fieldKey] = $subField;
75+
}
76+
}
77+
78+
if (isset($field['type']) === FALSE) {
79+
return;
80+
}
81+
82+
if (
83+
\in_array(
84+
\strtolower($field['type']), [
85+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT,
86+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD
87+
], TRUE
88+
)
89+
) {
90+
$field['type'] = \Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_STRING;
91+
}
92+
}
93+
4794
}

src/Model/ValidateMapping/AllowedValues.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class AllowedValues
1616

1717
// Text types
1818
public const TYPE_TEXT = 'text';
19+
public const TYPE_STRING = 'string';
1920
public const TYPE_KEYWORD = 'keyword';
2021

2122
// Boolean types
@@ -60,6 +61,7 @@ class AllowedValues
6061

6162
public const TYPES = [
6263
self::TYPE_TEXT => self::TYPE_TEXT,
64+
self::TYPE_STRING => self::TYPE_STRING,
6365
self::TYPE_KEYWORD => self::TYPE_KEYWORD,
6466

6567
self::TYPE_BOOLEAN => self::TYPE_BOOLEAN,

tests/SpameriTests/Elastic/Config.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ class Config
1515
public const INDEX_RESTORE = 'spameri_product_restore';
1616
public const INDEX_MIGRATE = 'spameri_product_migrate';
1717
public const INDEX_MIGRATE_NEW = 'spameri_product_migrate_new';
18+
public const INDEX_CREATE = 'spameri_video_create';
1819

1920
}

tests/SpameriTests/Elastic/Data/Model/VideoMapping.php

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,80 @@ public function __construct(
1818

1919
public function provide(): \Spameri\ElasticQuery\Mapping\Settings
2020
{
21-
return new \Spameri\ElasticQuery\Mapping\Settings($this->index);
21+
$settings = new \Spameri\ElasticQuery\Mapping\Settings($this->index);
22+
23+
$nameFields = new \Spameri\ElasticQuery\Mapping\Settings\Mapping\SubFields(
24+
'name',
25+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
26+
);
27+
$nameFields->addMappingField(
28+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
29+
'edgeNgram',
30+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
31+
)
32+
);
33+
$nameFields->addMappingField(
34+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
35+
'wordSplit',
36+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
37+
)
38+
);
39+
$nameFields->addMappingField(
40+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
41+
'wordJoin',
42+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
43+
)
44+
);
45+
$settings->addMappingSubField($nameFields);
46+
47+
$story = new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldObject(
48+
'story',
49+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldCollection(
50+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
51+
'description',
52+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
53+
),
54+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
55+
'tagLine',
56+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD
57+
)
58+
)
59+
);
60+
$settings->addMappingFieldObject($story);
61+
62+
$season = new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldObject(
63+
'season',
64+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldCollection(
65+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
66+
'number',
67+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD
68+
),
69+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldObject(
70+
'episodes',
71+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\FieldCollection(
72+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
73+
'id',
74+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD
75+
),
76+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
77+
'number',
78+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD
79+
),
80+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
81+
'name',
82+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
83+
),
84+
new \Spameri\ElasticQuery\Mapping\Settings\Mapping\Field(
85+
'description',
86+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT
87+
)
88+
)
89+
)
90+
)
91+
);
92+
$settings->addMappingFieldObject($season);
93+
94+
return $settings;
2295
}
2396

2497
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace SpameriTests\Elastic\Model\Indices;
4+
5+
require_once __DIR__ . '/../../../../bootstrap.php';
6+
7+
/**
8+
* @testCase
9+
*/
10+
class CreateTest extends \SpameriTests\Elastic\AbstractTestCase
11+
{
12+
13+
public function testProcess(): void
14+
{
15+
/** @var \Spameri\Elastic\Model\VersionProvider $versionProvider */
16+
$versionProvider = $this->container->getByType(\Spameri\Elastic\Model\VersionProvider::class);
17+
/** @var \Spameri\Elastic\Model\Indices\GetMapping $getMapping */
18+
$getMapping = $this->container->getByType(\Spameri\Elastic\Model\Indices\GetMapping::class);
19+
/** @var \SpameriTests\Elastic\Data\Model\VideoMapping $videoMapping */
20+
$videoMapping = $this->container->getByType(\SpameriTests\Elastic\Data\Model\VideoMapping::class);
21+
22+
$create = new \Spameri\Elastic\Model\Indices\Create(
23+
$this->container->getByType(\Spameri\Elastic\ClientProvider::class),
24+
$this->container->getByType(\Spameri\Elastic\Model\VersionProvider::class)
25+
);
26+
27+
$create->execute(\SpameriTests\Elastic\Config::INDEX_CREATE, $videoMapping->provide()->toArray());
28+
$response = $getMapping->execute(\SpameriTests\Elastic\Config::INDEX_CREATE);
29+
30+
if ($versionProvider->provide() <= \Spameri\ElasticQuery\Response\Result\Version::ELASTIC_VERSION_ID_7) {
31+
\Tester\Assert::true(
32+
isset($response[\SpameriTests\Elastic\Config::INDEX_CREATE]['mappings'][\SpameriTests\Elastic\Config::INDEX_CREATE])
33+
);
34+
$existingMapping = $response[\SpameriTests\Elastic\Config::INDEX_CREATE]['mappings'][\SpameriTests\Elastic\Config::INDEX_CREATE];
35+
36+
\Tester\Assert::same(
37+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_STRING,
38+
$existingMapping['properties']['name']['type']
39+
);
40+
\Tester\Assert::same(
41+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_STRING,
42+
$existingMapping['properties']['name']['fields']['edgeNgram']['type']
43+
);
44+
\Tester\Assert::same(
45+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_STRING,
46+
$existingMapping['properties']['season']['properties']['number']['type']
47+
);
48+
\Tester\Assert::same(
49+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_STRING,
50+
$existingMapping['properties']['story']['properties']['description']['type']
51+
);
52+
53+
} else {
54+
\Tester\Assert::true(
55+
isset($response[\SpameriTests\Elastic\Config::INDEX_CREATE]['mappings'])
56+
);
57+
$existingMapping = $response[\SpameriTests\Elastic\Config::INDEX_CREATE]['mappings'];
58+
59+
\Tester\Assert::same(
60+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT,
61+
$existingMapping['properties']['name']['type']
62+
);
63+
\Tester\Assert::same(
64+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_TEXT,
65+
$existingMapping['properties']['name']['fields']['edgeNgram']['type']
66+
);
67+
\Tester\Assert::same(
68+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD,
69+
$existingMapping['properties']['season']['properties']['number']['type']
70+
);
71+
\Tester\Assert::same(
72+
\Spameri\Elastic\Model\ValidateMapping\AllowedValues::TYPE_KEYWORD,
73+
$existingMapping['properties']['story']['properties']['description']['type']
74+
);
75+
}
76+
}
77+
78+
79+
protected function tearDown()
80+
{
81+
/** @var \Spameri\Elastic\Model\Indices\Delete $delete */
82+
$delete = $this->container->getByType(\Spameri\Elastic\Model\Indices\Delete::class);
83+
$delete->execute(\SpameriTests\Elastic\Config::INDEX_CREATE);
84+
}
85+
86+
}
87+
88+
(new CreateTest())->run();

0 commit comments

Comments
 (0)