forked from TomLous/solr-schema-dataimport-generator
/
generatePHPAPIConfig.php
227 lines (172 loc) · 10.8 KB
/
generatePHPAPIConfig.php
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?php
/**
* @author Tom Lous <tomlous@gmail.com>
* @copyright 2015 Tom Lous
* @package package
* Datetime: 16/06/15 11:25
*/
print PHP_EOL . "------------------------------------" . PHP_EOL . "Generating solr-api-config.json" . PHP_EOL;
include_once('utils.php');
// Make sure to escape all slashes in Json eg"pattern": "([\.,;:-_])", => "pattern": "([\\.,;:-_])",
$config = json_decode(file_get_contents("config/config.json"), true);
if (json_last_error()) {
print "json decode error: " . json_last_error_msg();
exit();
}
$dependencyVariables = array();
if(isset($config['dependencyVariables'])){
$dependencyVariables = $config['dependencyVariables'];
}
$fields = $config['fields'];
$apiConfig = $config['searchOptions'];
//$fieldTypes = $config['fieldTypes'];
foreach($apiConfig as $action => $data ){
$apiConfig[$action]['dependencies'] = array();
$apiConfig[$action]['fields'] = array();
$apiConfig[$action]['queryFields'] = array();
$apiConfig[$action]['phraseFields'] = array();
$apiConfig[$action]['phraseBiGramFields'] = array();
$apiConfig[$action]['phraseTriGramFields'] = array();
$apiConfig[$action]['columns'] = array();
if($data['facets']){
$apiConfig[$action]['facetFields'] = array();
}
$apiConfig[$action]['dependencyFields'] = array();
}
// fields generation
foreach($fields as $fieldName=>$fieldInfo){
$dependancyArray = createDependencyArray($fieldInfo, $dependencyVariables);
createAPIConfig($apiConfig, $fieldName, $fieldInfo,$dependancyArray);
}
foreach($apiConfig as $action => $data ){
$apiConfig[$action]['dependencies'] = array_values($apiConfig[$action]['dependencies']);
usort($apiConfig[$action]['columns'], function ($a, $b) {
return $a['columnPosition'] > $b['columnPosition'];
});
// $apiConfig[$action]['columns'] = array_values($apiConfig[$action]['columns']);
}
$apiConfig['__meta']=array('comment'=>"Generated ".date('Y-m-d')." with Solr Schema Generator (https://github.com/TomLous/solr-schema-dataimport-generator)");
file_put_contents('target/apiconfig.json', jsonFormat($apiConfig));
// methods
function createAPIConfig(&$conf, $fieldName, $fieldInfo, $dependancyArray){
global $config;
if(isset($fieldInfo['searchOptions'])){
foreach($dependancyArray as $pos=>$dependancyData){
$searchActions = $fieldInfo['searchOptions']['searchActions'];
$returnActions = $fieldInfo['searchOptions']['returnActions'];
$combinedActions = array_unique(array_merge($searchActions, $returnActions));
foreach($fieldInfo['types'] as $fieldNamePostfix=>$fieldType){
foreach($combinedActions as $action){
$isSourceField = false;
$currentFieldName = $fieldName;
if($fieldNamePostfix == '_'){
$isSourceField = true;
}else{
$currentFieldName .= '_'.$fieldNamePostfix;
}
$currentFieldName = dependencyParser($currentFieldName, $dependancyData);
$currentFieldType = dependencyParser($fieldType, $dependancyData);
$dependancyConf = false;
if(isset($fieldInfo['__dependency'])){
$dependancyConf = array();
$idxa = array();
foreach($fieldInfo['__dependency'] as $key=>$dep){
$dependancyConf[$key] = $dependancyData[$key];
$idxa[] = $key.'_'.$dependancyData[$key];
}
sort($idxa);
$conf[$action]['dependencies'][implode('_',$idxa)] = $dependancyData;
}
// $apiConfig[$action]['dependencyVariables'] = $config['dependencyVariables'];
$defaults = array('search'=>false,'return'=>false,'facet'=>false, 'boost'=>0, 'fuzzy'=>false, 'additional'=>array(), 'phraseField'=>false, 'phraseFieldBiGram'=>false, 'phraseFieldTriGram'=>false);
$fieldData = array_merge($defaults, $fieldInfo['searchOptions'], $dependancyData);
$setSearch = array_search($action, $searchActions)!==false && $fieldData['search'];
$setReturn = array_search($action, $returnActions)!==false && $fieldData['return'];
$fieldTypeData = $config['fieldTypes'][$fieldType];
if(isset($fieldTypeData['__searchPhraseField'])){
$fieldData['phraseField'] = min($fieldData['phraseField'], $fieldTypeData['__searchPhraseField']);
$fieldData['phraseFieldBiGram'] = min($fieldData['phraseFieldBiGram'], $fieldTypeData['__searchPhraseField']);
$fieldData['phraseFieldTriGram'] = min($fieldData['phraseFieldTriGram'], $fieldTypeData['__searchPhraseField']);
}
if(isset($fieldTypeData['__searchBoostFactor'])){
$fieldData['boost'] = ceil($fieldData['boost'] * $fieldTypeData['__searchBoostFactor']);
}
if(isset($fieldTypeData['__searchBoostValue'])){
$fieldData['boost'] = $fieldTypeData['__searchBoostValue'];
}
if(isset($fieldTypeData['__searchFuzzyFactor'])){
$fieldData['fuzzy'] = ceil($fieldData['fuzzy'] * $fieldTypeData['__searchFuzzyFactor']);
}
if(isset($fieldTypeData['__searchFuzzyValue'])){
$fieldData['fuzzy'] = $fieldTypeData['__searchFuzzyValue'];
}
$fieldData['wildcard'] = true;
if(isset($fieldTypeData["__searchWildcard"])){
$fieldData['wildcard'] = $fieldTypeData["__searchWildcard"];
}
// set fields
if($setReturn && isset($conf[$action]['fields'])){
$conf[$action]['fields'][$currentFieldName] = array('field'=>$currentFieldName,'fuzzy'=>$fieldData['fuzzy'], 'main'=>$isSourceField);
}
if($isSourceField && $fieldData['columnPosition']!==false){
$columnData = array('field'=>$currentFieldName, 'columnShow'=>$fieldData['columnShow'],'columnPosition'=> $fieldData['columnPosition'], 'category'=> $fieldData['category']);
if(isset($fieldInfo['multiValued'])){
$columnData['multiValued'] = true;
}
if($dependancyConf && isset($conf[$action]['dependencyFields'])){
$columnData['dependency'] = $dependancyConf;
}
if(isset($fieldData['columnName'])){
$columnData['columnName'] = $fieldData['columnName'];
}else{
$columnData['columnName'] = $currentFieldName;
}
$conf[$action]['columns'][] = $columnData;
}
if($setSearch && $fieldData['boost'] && isset($conf[$action]['queryFields'])){
$statement = $currentFieldName . ((is_numeric($fieldData['boost']) && $fieldData['boost']!=1)?"^".ceil($fieldData['boost']):"");
$conf[$action]['queryFields'][$currentFieldName] = array('field'=>$currentFieldName, 'boost'=>$fieldData['boost'], 'statement'=>$statement, 'wildcard'=>$fieldData['wildcard']);
}
if($setSearch && $fieldData['phraseField'] && isset($conf[$action]['phraseFields'])){
$phraseBoost = isset($fieldData['boost']) ? $fieldData['boost'] : 1;
$phraseBoost *= is_numeric($fieldData['phraseField'])?intval($fieldData['phraseField']):1;
$phraseBoost = ceil($phraseBoost);
$statement = $currentFieldName . "^".$phraseBoost;
$conf[$action]['phraseFields'][$currentFieldName] = array('field'=>$currentFieldName, 'boost'=>$phraseBoost, 'statement'=>$statement);
}
if($setSearch && $fieldData['phraseFieldBiGram'] && isset($conf[$action]['phraseBiGramFields'])){
$phraseBoost = isset($fieldData['boost']) ? $fieldData['boost'] : 1;
$phraseBoost *= is_numeric($fieldData['phraseFieldBiGram'])?intval($fieldData['phraseFieldBiGram']):1;
$phraseBoost = ceil($phraseBoost);
$statement = $currentFieldName . "^".$phraseBoost;
$conf[$action]['phraseBiGramFields'][$currentFieldName] = array('field'=>$currentFieldName, 'boost'=>$phraseBoost, 'statement'=>$statement);
}
if($setSearch && $fieldData['phraseFieldTriGram'] && isset($conf[$action]['phraseTriGramFields'])){
$phraseBoost = isset($fieldData['boost']) ? $fieldData['boost'] : 1;
$phraseBoost *= is_numeric($fieldData['phraseFieldTriGram'])?intval($fieldData['phraseFieldTriGram']):1;
$phraseBoost = ceil($phraseBoost);
$statement = $currentFieldName . "^".$phraseBoost;
$conf[$action]['phraseTriGramFields'][$currentFieldName] = array('field'=>$currentFieldName, 'boost'=>$phraseBoost, 'statement'=>$statement);
}
if($setSearch && $isSourceField && $fieldData['facet'] && $conf[$action]['facets'] && isset($conf[$action]['facetFields'])){
$conf[$action]['facetFields'][$currentFieldName] = array('field'=>$currentFieldName);
}
if($dependancyConf && isset($conf[$action]['dependencyFields'])){
$conf[$action]['dependencyFields'][$currentFieldName] = $dependancyConf;
}
foreach($fieldData['additional'] as $key=>$opt){
if(($opt == "stats.field" || $opt == "stats.facet") && isset($conf[$action]['options']['stats']) && $conf[$action]['options']['stats']){
if(!isset($conf[$action]['options'][$opt])){
$conf[$action]['options'][$opt]= array();
}
$conf[$action]['options'][$opt][] = $currentFieldName;
}
if(($opt == "facet.heatmap") && isset($conf[$action]['custom']['heatmap'])){
$conf[$action]['custom']['heatmap'][$opt] = $currentFieldName;
}
}
}
}
}
}
}