1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\Api\ExtensionAttribute;
use Magento\Framework\Api\ExtensionAttribute\Config;
use Magento\Framework\Api\ExtensionAttribute\Config\Converter as Converter;
use Magento\Framework\Api\SimpleDataObjectConverter;
/**
* Join processor helper class
*/
class JoinProcessorHelper
{
/**
* @var \Magento\Framework\Api\ExtensionAttribute\Config
*/
private $config;
/**
* @var \Magento\Framework\Api\ExtensionAttribute\JoinDataInterfaceFactory
*/
private $joinDataInterfaceFactory;
/**
* Initialize dependencies.
*
* @param Config $config
* @param JoinDataInterfaceFactory $joinDataInterfaceFactory
*/
public function __construct(
Config $config,
JoinDataInterfaceFactory $joinDataInterfaceFactory
) {
$this->config = $config;
$this->joinDataInterfaceFactory = $joinDataInterfaceFactory;
}
/**
* Generate a list of select fields with mapping of client facing attribute names to field names used in SQL select.
*
* @param string $attributeCode
* @param array $selectFields
* @return array
*/
public function getSelectFieldsMap($attributeCode, $selectFields)
{
$referenceTableAlias = $this->getReferenceTableAlias($attributeCode);
$useFieldInAlias = (count($selectFields) > 1);
$selectFieldsAliases = [];
foreach ($selectFields as $selectField) {
$internalFieldName = $selectField[Converter::JOIN_FIELD_COLUMN]
? $selectField[Converter::JOIN_FIELD_COLUMN]
: $selectField[Converter::JOIN_FIELD];
$setterName = 'set'
. ucfirst(SimpleDataObjectConverter::snakeCaseToCamelCase($selectField[Converter::JOIN_FIELD]));
$selectFieldsAliases[] = [
JoinDataInterface::SELECT_FIELD_EXTERNAL_ALIAS => $attributeCode
. ($useFieldInAlias ? '.' . $selectField[Converter::JOIN_FIELD] : ''),
JoinDataInterface::SELECT_FIELD_INTERNAL_ALIAS => $referenceTableAlias . '_' . $internalFieldName,
JoinDataInterface::SELECT_FIELD_WITH_DB_PREFIX => $referenceTableAlias . '.' . $internalFieldName,
JoinDataInterface::SELECT_FIELD_SETTER => $setterName
];
}
return $selectFieldsAliases;
}
/**
* Generate reference table alias.
*
* @param string $attributeCode
* @return string
*/
public function getReferenceTableAlias($attributeCode)
{
return 'extension_attribute_' . $attributeCode;
}
/**
* Returns config data values
*
* @return array|mixed|null
*/
public function getConfigData()
{
return $this->config->get();
}
/**
* JoinDataInterface getter
*
* @return JoinDataInterface
*/
public function getJoinDataInterface()
{
return $this->joinDataInterfaceFactory->create();
}
}