aboutyou-sdk 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/aboutyou-sdk.rb +545 -0
- data/lib/aboutyou-sdk/Client.rb +125 -0
- data/lib/aboutyou-sdk/Constants.rb +48 -0
- data/lib/aboutyou-sdk/Criteria/ProductFields.rb +54 -0
- data/lib/aboutyou-sdk/Criteria/ProductSearchCriteria.rb +436 -0
- data/lib/aboutyou-sdk/Factory/DefaultModelFactory.rb +454 -0
- data/lib/aboutyou-sdk/Model/AbstractModel.rb +26 -0
- data/lib/aboutyou-sdk/Model/App.rb +35 -0
- data/lib/aboutyou-sdk/Model/Autocomplete.rb +92 -0
- data/lib/aboutyou-sdk/Model/Basket.rb +262 -0
- data/lib/aboutyou-sdk/Model/Basket/AbstractBasketItem.rb +76 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketItem.rb +100 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketSet.rb +192 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketSetItem.rb +46 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketVariantItem.rb +137 -0
- data/lib/aboutyou-sdk/Model/CategoriesResult.rb +15 -0
- data/lib/aboutyou-sdk/Model/Category.rb +126 -0
- data/lib/aboutyou-sdk/Model/CategoryManager/DefaultCategoryManager.rb +172 -0
- data/lib/aboutyou-sdk/Model/CategoryTree.rb +35 -0
- data/lib/aboutyou-sdk/Model/Facet.rb +105 -0
- data/lib/aboutyou-sdk/Model/FacetGroup.rb +110 -0
- data/lib/aboutyou-sdk/Model/FacetGroupSet.rb +247 -0
- data/lib/aboutyou-sdk/Model/FacetManager/DefaultFacetManager.rb +79 -0
- data/lib/aboutyou-sdk/Model/Image.rb +134 -0
- data/lib/aboutyou-sdk/Model/ImageSize.rb +21 -0
- data/lib/aboutyou-sdk/Model/InitiateOrder.rb +50 -0
- data/lib/aboutyou-sdk/Model/Order.rb +17 -0
- data/lib/aboutyou-sdk/Model/Product.rb +543 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult.rb +125 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/FacetCount.rb +26 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/FacetCounts.rb +38 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/PriceRange.rb +49 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/SaleCounts.rb +58 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/TermsCount.rb +27 -0
- data/lib/aboutyou-sdk/Model/ProductsEansResult.rb +43 -0
- data/lib/aboutyou-sdk/Model/ProductsResult.rb +52 -0
- data/lib/aboutyou-sdk/Model/ResultError.rb +24 -0
- data/lib/aboutyou-sdk/Model/Variant.rb +255 -0
- data/lib/aboutyou-sdk/Model/VariantsResult.rb +102 -0
- data/lib/aboutyou-sdk/Query.rb +261 -0
- data/lib/aboutyou-sdk/QueryBuilder.rb +440 -0
- data/tests/Sinatra-test/Main.rb +5 -0
- data/tests/testApiClient.rb +35 -0
- data/tests/testAutocomplete.rb +40 -0
- data/tests/testCatFilter.rb +35 -0
- data/tests/testCatTree.rb +37 -0
- data/tests/testFacets.rb +36 -0
- data/tests/testProdCatLongestPath.rb +34 -0
- data/tests/testProductSearchResult.rb +35 -0
- data/tests/testProductsByIds.rb +34 -0
- data/tests/testVariantsByIds.rb +34 -0
- metadata +122 -0
@@ -0,0 +1,255 @@
|
|
1
|
+
module AboutYou
|
2
|
+
module SDK
|
3
|
+
module Model
|
4
|
+
|
5
|
+
class Variant
|
6
|
+
include AbstractModel
|
7
|
+
|
8
|
+
attr_accessor :factory
|
9
|
+
attr_accessor :product
|
10
|
+
attr_accessor :id
|
11
|
+
attr_accessor :images
|
12
|
+
attr_accessor :selectedImage
|
13
|
+
attr_accessor :aboutNumber
|
14
|
+
attr_accessor :facetGroups
|
15
|
+
attr_accessor :ean
|
16
|
+
attr_accessor :isDefault
|
17
|
+
attr_accessor :price
|
18
|
+
attr_accessor :oldPrice
|
19
|
+
attr_accessor :retailPrice
|
20
|
+
attr_accessor :additionalInfo
|
21
|
+
attr_accessor :quantity
|
22
|
+
attr_accessor :facetIds
|
23
|
+
attr_accessor :firstActiveDate
|
24
|
+
attr_accessor :firstSaleDate
|
25
|
+
attr_accessor :createdDate
|
26
|
+
attr_accessor :updatedDate
|
27
|
+
attr_accessor :color
|
28
|
+
attr_accessor :length
|
29
|
+
attr_accessor :seasonCode
|
30
|
+
|
31
|
+
###
|
32
|
+
# @param \stdClass $jsonObject
|
33
|
+
# @param ModelFactoryInterface $factory
|
34
|
+
# @param Product $product
|
35
|
+
#
|
36
|
+
# @return static
|
37
|
+
###
|
38
|
+
def self.createFromJson(jsonObject, factory, product)
|
39
|
+
|
40
|
+
jsonObj = jsonObject
|
41
|
+
if (!jsonObj["id"])
|
42
|
+
raise 'MalformedJsonException'
|
43
|
+
end
|
44
|
+
|
45
|
+
variant = self.new
|
46
|
+
variant.factory = factory;
|
47
|
+
variant.product = product;
|
48
|
+
|
49
|
+
|
50
|
+
variant.parseImages(jsonObj["images"])
|
51
|
+
#free memory
|
52
|
+
jsonObj["images"] = nil
|
53
|
+
|
54
|
+
variant.id = jsonObj["id"]
|
55
|
+
|
56
|
+
variant.aboutNumber = (jsonObj["about_number"]) ? jsonObj["about_number"] : nil
|
57
|
+
variant.ean = (jsonObj["ean"]) ? jsonObj["ean"] : nil
|
58
|
+
variant.isDefault = (jsonObj["default"]) ? jsonObj["default"] : nil
|
59
|
+
variant.price = (jsonObj["price"]) ? jsonObj["price"] : nil
|
60
|
+
variant.oldPrice = (jsonObj["old_price"]) ? jsonObj["old_price"] : nil
|
61
|
+
variant.retailPrice = (jsonObj["retail_price"]) ? jsonObj["retail_price"] : nil
|
62
|
+
variant.additionalInfo = (jsonObj["additional_info"]) ? jsonObj["additional_info"] : nil
|
63
|
+
variant.quantity = (jsonObj["quantity"]) ? jsonObj["quantity"] : 0
|
64
|
+
variant.firstActiveDate = (jsonObj["first_active_date"]) ? jsonObj["first_active_date"] : nil
|
65
|
+
variant.firstSaleDate = (jsonObj["first_sale_date"]) ? jsonObj["first_sale_date"] : nil
|
66
|
+
variant.createdDate = (jsonObj["created_date"]) ? jsonObj["created_date"] : nil
|
67
|
+
variant.updatedDate = (jsonObj["updated_date"]) ? jsonObj["updated_date"] : nil
|
68
|
+
|
69
|
+
variant.facetIds = variant.parseFacetIds(jsonObj)
|
70
|
+
variant.color = variant.facetGroup(AboutYou::SDK::Constants::FACET_COLOR, jsonObject)
|
71
|
+
variant.length = variant.facetGroup(AboutYou::SDK::Constants::FACET_LENGTH, jsonObject)
|
72
|
+
variant.seasonCode = variant.facetGroup(AboutYou::SDK::Constants::FACET_SEASON_CODE,jsonObject)
|
73
|
+
|
74
|
+
|
75
|
+
return variant
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
def parseImages(imageObject)
|
80
|
+
if (!self.images)
|
81
|
+
self.images = Array(nil);
|
82
|
+
if(imageObject)
|
83
|
+
imageObject.each do |image|
|
84
|
+
self.images.push(self.factory.createImage(image))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
###
|
91
|
+
# Get image by given hash.
|
92
|
+
#
|
93
|
+
# @param string $hash The image hash.
|
94
|
+
#
|
95
|
+
# @return Image
|
96
|
+
###
|
97
|
+
def imageByHash(hash)
|
98
|
+
|
99
|
+
self.images.each do |image|
|
100
|
+
return image if(image.hash == hash)
|
101
|
+
end
|
102
|
+
nil
|
103
|
+
end
|
104
|
+
|
105
|
+
###
|
106
|
+
# Select a specific image.
|
107
|
+
#
|
108
|
+
# @param string $hash The image hash or null for default image.
|
109
|
+
#
|
110
|
+
# @return void
|
111
|
+
#
|
112
|
+
# @depracted
|
113
|
+
###
|
114
|
+
def selectImage(hash=nil)
|
115
|
+
if (hash)
|
116
|
+
self.selectedImage = imageByHash(hash);
|
117
|
+
else
|
118
|
+
self.selectedImage = nil;
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
###
|
123
|
+
# Get selected or default image.
|
124
|
+
#
|
125
|
+
# @return Image
|
126
|
+
###
|
127
|
+
def image
|
128
|
+
|
129
|
+
if (self.selectedImage)
|
130
|
+
return self.selectedImage;
|
131
|
+
elsif (self.images[0])
|
132
|
+
return self.images[0];
|
133
|
+
end
|
134
|
+
return nil;
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
def parseFacetIds(jsonObject)
|
139
|
+
|
140
|
+
ids = Array(nil)
|
141
|
+
if !(jsonObject["attributes"].empty?)
|
142
|
+
jsonObject["attributes"].each do |group, aIds|
|
143
|
+
gid = group[11..group.length] # rm prefix "attributs_"
|
144
|
+
ids.push(Hash[gid => aIds]);
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
return ids;
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
def generateFacetGroupSet(jsonObject)
|
153
|
+
|
154
|
+
ids = self.parseFacetIds(jsonObject)
|
155
|
+
self.facetGroups= AboutYou::SDK::Model::FacetGroupSet.new(ids)
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
###
|
160
|
+
# @return FacetGroupSet
|
161
|
+
###
|
162
|
+
def facetGroupSet(jsonObject)
|
163
|
+
|
164
|
+
if !(self.facetGroups)
|
165
|
+
self.generateFacetGroupSet(jsonObject);
|
166
|
+
end
|
167
|
+
return self.facetGroups;
|
168
|
+
end
|
169
|
+
|
170
|
+
###
|
171
|
+
# @param integer $groupId
|
172
|
+
#
|
173
|
+
# @return FacetGroup|null
|
174
|
+
###
|
175
|
+
def facetGroup(groupId, jsonObject)
|
176
|
+
|
177
|
+
return self.facetGroupSet(jsonObject).group(groupId);
|
178
|
+
end
|
179
|
+
|
180
|
+
###
|
181
|
+
# @return FacetGroup|null
|
182
|
+
###
|
183
|
+
def size()
|
184
|
+
|
185
|
+
###
|
186
|
+
# @todo: Instance level caching
|
187
|
+
###
|
188
|
+
groupId = self.sizeGroupId();
|
189
|
+
|
190
|
+
if !(groupId.empty?)
|
191
|
+
return self.facetGroup(groupId);
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
###
|
196
|
+
# @return integer|null
|
197
|
+
###
|
198
|
+
def sizeGroupId()
|
199
|
+
|
200
|
+
keys = Hash.new
|
201
|
+
|
202
|
+
groups = self.facetGroupSet().groups();
|
203
|
+
|
204
|
+
if (groups.is_a? Array)
|
205
|
+
groups.each do |group|
|
206
|
+
keys[group.name] = group.groupId();
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
sizeRun = self.facetGroup(AboutYou::SDK::Constants::FACET_SIZE_RUN);
|
211
|
+
|
212
|
+
if !(sizeRun.empty?)
|
213
|
+
sizeRun.facets.each do |facet|
|
214
|
+
groupName = facet.value();
|
215
|
+
if (keys.key?(groupName))
|
216
|
+
return keys[groupName];
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
if (keys.key?('size'))
|
221
|
+
return keys['size'];
|
222
|
+
end
|
223
|
+
if (keys.key?('size_run'))
|
224
|
+
return keys['size_run'];
|
225
|
+
end
|
226
|
+
|
227
|
+
return nil;
|
228
|
+
end
|
229
|
+
|
230
|
+
###
|
231
|
+
# Returns the quantity per pack for this variant.
|
232
|
+
# By default, this returns 1. But some items can have a bigger number.
|
233
|
+
#
|
234
|
+
# @return int quantity per pack
|
235
|
+
###
|
236
|
+
def quantityPerPack()
|
237
|
+
|
238
|
+
facetGroup = self.facetGroup(AboutYou::SDK::Constants::FACET_QUANTITY_PER_PACK);
|
239
|
+
|
240
|
+
if !(facetGroup)
|
241
|
+
return 1;
|
242
|
+
end
|
243
|
+
|
244
|
+
facets = facetGroup.facets();
|
245
|
+
|
246
|
+
if !(facets)
|
247
|
+
return 1;
|
248
|
+
end
|
249
|
+
|
250
|
+
return facets[0].value();
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module AboutYou
|
2
|
+
module SDK
|
3
|
+
module Model
|
4
|
+
class VariantsResult
|
5
|
+
|
6
|
+
# @var Variant[] */
|
7
|
+
attr_accessor :variants
|
8
|
+
# @var array */
|
9
|
+
attr_accessor :errors
|
10
|
+
|
11
|
+
###
|
12
|
+
#
|
13
|
+
# @param \stdClass $jsonObject
|
14
|
+
# @param \Collins\ShopApi\Model\ModelFactoryInterface $factory
|
15
|
+
# @param \Collins\ShopApi\Model\ProductSearchResult $productSearchResult
|
16
|
+
#
|
17
|
+
# @return static
|
18
|
+
###
|
19
|
+
def self.create(variants, errors = Array(nil), productSearchResult)
|
20
|
+
|
21
|
+
variantsResult = self.new
|
22
|
+
variantsResult.variants = Hash.new
|
23
|
+
variantsResult.errors = errors;
|
24
|
+
|
25
|
+
if (productSearchResult == false || variants.count == 0)
|
26
|
+
# no variant was found
|
27
|
+
return variantsResult;
|
28
|
+
end
|
29
|
+
|
30
|
+
# get products from product-search
|
31
|
+
products = productSearchResult.products();
|
32
|
+
variants.each do |variantId, productId|
|
33
|
+
if !(products[productId])
|
34
|
+
# product was not delivered
|
35
|
+
variantsResult.errors.push(variantId)
|
36
|
+
next
|
37
|
+
end
|
38
|
+
|
39
|
+
product = products[productId];
|
40
|
+
variant = product.variantById(variantId);
|
41
|
+
|
42
|
+
if (variant.is_a? AboutYou::SDK::Model::Variant)
|
43
|
+
variantsResult.variants[variantId] = variant;
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
return variantsResult;
|
48
|
+
end
|
49
|
+
|
50
|
+
###
|
51
|
+
# @return bool
|
52
|
+
###
|
53
|
+
def hasVariantsFound()
|
54
|
+
|
55
|
+
self.variants.count > 0;
|
56
|
+
end
|
57
|
+
|
58
|
+
###
|
59
|
+
# @return bool
|
60
|
+
###
|
61
|
+
def hasVariantsNotFound()
|
62
|
+
|
63
|
+
self.errors.count > 0;
|
64
|
+
end
|
65
|
+
|
66
|
+
###
|
67
|
+
# @return Variant[]
|
68
|
+
###
|
69
|
+
def variantsFound()
|
70
|
+
|
71
|
+
self.variants;
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
###
|
76
|
+
# @param int $id
|
77
|
+
#
|
78
|
+
#
|
79
|
+
# @return Variant|null
|
80
|
+
###
|
81
|
+
def variantById(id)
|
82
|
+
|
83
|
+
result = nil;
|
84
|
+
|
85
|
+
if (self.variants[id])
|
86
|
+
result = self.variants[id];
|
87
|
+
end
|
88
|
+
|
89
|
+
return result;
|
90
|
+
end
|
91
|
+
|
92
|
+
###
|
93
|
+
# @return int[]
|
94
|
+
###
|
95
|
+
def variantsNotFound()
|
96
|
+
|
97
|
+
self.errors;
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,261 @@
|
|
1
|
+
require_relative 'QueryBuilder.rb'
|
2
|
+
module AboutYou
|
3
|
+
module SDK
|
4
|
+
class Query
|
5
|
+
include AboutYou::SDK::QueryBuilder
|
6
|
+
|
7
|
+
QUERY_TREE = 'category_tree';
|
8
|
+
QUERY_FACETS = 'facets';
|
9
|
+
|
10
|
+
attr_accessor :client
|
11
|
+
attr_accessor :query
|
12
|
+
attr_accessor :mapping
|
13
|
+
attr_accessor :factory
|
14
|
+
attr_accessor :ghostQuery
|
15
|
+
attr_accessor :allQuery
|
16
|
+
|
17
|
+
|
18
|
+
###
|
19
|
+
# @param ShopApiClient $client
|
20
|
+
# @param ModelFactoryInterface $factory
|
21
|
+
# @param EventDispatcher $eventDispatcher
|
22
|
+
###
|
23
|
+
def initialize(client, factory)
|
24
|
+
self.client = client
|
25
|
+
self.query=Array(nil)
|
26
|
+
self.ghostQuery = Array(nil)
|
27
|
+
self.allQuery = Array(nil)
|
28
|
+
self.factory=factory
|
29
|
+
self.mapping = Hash[
|
30
|
+
'autocompletion' => 'createAutocomplete',
|
31
|
+
'basket' => 'createBasket',
|
32
|
+
'category' => 'createCategoriesResult',
|
33
|
+
'category_tree' => 'createCategoryTree',
|
34
|
+
'facets' => 'createFacetsList',
|
35
|
+
'facet' => 'createFacetList',
|
36
|
+
'facet_types' => 'createFacetTypes',
|
37
|
+
'products' => 'createProductsResult',
|
38
|
+
'products_eans' => 'createProductsEansResult',
|
39
|
+
'product_search' => 'createProductSearchResult',
|
40
|
+
'suggest' => 'createSuggest',
|
41
|
+
'get_order' => 'createOrder',
|
42
|
+
'initiate_order' => 'initiateOrder',
|
43
|
+
'child_apps' => 'createChildApps',
|
44
|
+
'live_variant' => 'createVariantsResult'
|
45
|
+
]
|
46
|
+
end
|
47
|
+
|
48
|
+
###
|
49
|
+
# @param string $searchword The prefix search word to search for.
|
50
|
+
# @param int $limit Maximum number of results.
|
51
|
+
# @param array $types Array of types to search for (Constants::TYPE_...).
|
52
|
+
#
|
53
|
+
# @return $this
|
54
|
+
#
|
55
|
+
# @throws \InvalidArgumentException
|
56
|
+
###
|
57
|
+
def fetchAutocomplete(searchword,limit = nil,types = nil)
|
58
|
+
|
59
|
+
super(searchword, limit, types);
|
60
|
+
|
61
|
+
self.requireCategoryTree;
|
62
|
+
self.requireFacets;
|
63
|
+
|
64
|
+
return self
|
65
|
+
end
|
66
|
+
|
67
|
+
###
|
68
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
69
|
+
#
|
70
|
+
# @return $this
|
71
|
+
###
|
72
|
+
def fetchBasket(sessionId)
|
73
|
+
|
74
|
+
super(sessionId);
|
75
|
+
|
76
|
+
self.requireCategoryTree;
|
77
|
+
self.requireFacets;
|
78
|
+
|
79
|
+
return self
|
80
|
+
end
|
81
|
+
|
82
|
+
###
|
83
|
+
# @param string[]|int[] $ids
|
84
|
+
# @param array $fields
|
85
|
+
#
|
86
|
+
# @return $this
|
87
|
+
###
|
88
|
+
def fetchProductsByIds(ids,fields = Array(nil))
|
89
|
+
super(ids, fields);
|
90
|
+
if (AboutYou::SDK::Criteria::ProductFields.requiresCategories(fields))
|
91
|
+
self.requireCategoryTree();
|
92
|
+
end
|
93
|
+
if (AboutYou::SDK::Criteria::ProductFields.requiresFacets(fields))
|
94
|
+
self.requireFacets();
|
95
|
+
end
|
96
|
+
|
97
|
+
return self;
|
98
|
+
end
|
99
|
+
|
100
|
+
###
|
101
|
+
# @param string[] $eans
|
102
|
+
# @param array $fields
|
103
|
+
#
|
104
|
+
# @return $this
|
105
|
+
###
|
106
|
+
def fetchProductsByEans(eans,fields = Array(nil))
|
107
|
+
super(eans, fields);
|
108
|
+
|
109
|
+
if (AboutYou::SDK::Criteria::ProductFields.requiresCategories(fields))
|
110
|
+
self.requireCategoryTree();
|
111
|
+
end
|
112
|
+
if (AboutYou::SDK::Criteria::ProductFields.requiresFacets(fields))
|
113
|
+
self.requireFacets();
|
114
|
+
end
|
115
|
+
|
116
|
+
return self;
|
117
|
+
end
|
118
|
+
|
119
|
+
###
|
120
|
+
# @param ProductSearchCriteria $criteria
|
121
|
+
#
|
122
|
+
# @return $this
|
123
|
+
###
|
124
|
+
def fetchProductSearch(criteria)
|
125
|
+
|
126
|
+
super(criteria);
|
127
|
+
|
128
|
+
if (criteria.requiresCategories())
|
129
|
+
self.requireCategoryTree();
|
130
|
+
end
|
131
|
+
if (criteria.requiresFacets())
|
132
|
+
self.requireFacets();
|
133
|
+
end
|
134
|
+
|
135
|
+
return self
|
136
|
+
end
|
137
|
+
|
138
|
+
def requireCategoryTree(fetchForced = false)
|
139
|
+
if !(fetchForced || self.factory.categoryManager().isEmpty())
|
140
|
+
return self
|
141
|
+
end
|
142
|
+
|
143
|
+
self.ghostQuery.push(Hash[QUERY_TREE => Hash[
|
144
|
+
'category_tree' => Hash['version' => '2']]])
|
145
|
+
|
146
|
+
return self
|
147
|
+
end
|
148
|
+
|
149
|
+
def requireFacets(fetchForced = false)
|
150
|
+
if !(fetchForced || self.factory.facetManager.isEmpty)
|
151
|
+
return self;
|
152
|
+
end
|
153
|
+
self.ghostQuery.push(Hash[QUERY_FACETS => Hash[
|
154
|
+
'facets' => Hash.new]])
|
155
|
+
|
156
|
+
return self;
|
157
|
+
end
|
158
|
+
|
159
|
+
###
|
160
|
+
# @return string
|
161
|
+
###
|
162
|
+
def queryString()
|
163
|
+
result = Array(nil)
|
164
|
+
self.ghostQuery.each do |ghostQuery|
|
165
|
+
(ghostQuery.is_a? Hash) ? result.push(ghostQuery[ghostQuery.keys[0]]) : nil
|
166
|
+
end
|
167
|
+
self.allQuery = result + self.query
|
168
|
+
return (result + self.query).to_json
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
###
|
173
|
+
# request the queries and returns an array of the results
|
174
|
+
#
|
175
|
+
# @return array
|
176
|
+
###
|
177
|
+
def execute()
|
178
|
+
|
179
|
+
if (self.query.empty? && self.ghostQuery.empty?)
|
180
|
+
return Array(nil);
|
181
|
+
end
|
182
|
+
queryString = queryString()
|
183
|
+
result = self.client.request(queryString);
|
184
|
+
parseResult(result, self.query.count > 1)
|
185
|
+
end
|
186
|
+
|
187
|
+
###
|
188
|
+
# request the current query and returns the first result
|
189
|
+
#
|
190
|
+
# @return mixed
|
191
|
+
###
|
192
|
+
def executeSingle()
|
193
|
+
|
194
|
+
result = execute();
|
195
|
+
result[-1]
|
196
|
+
end
|
197
|
+
|
198
|
+
def checkResponse(jsonResponse)
|
199
|
+
|
200
|
+
if (jsonResponse == false || !(jsonResponse.is_a? Array) || jsonResponse.count != self.allQuery.count)
|
201
|
+
|
202
|
+
raise 'UnexpectedResultException!'
|
203
|
+
end
|
204
|
+
|
205
|
+
|
206
|
+
jsonResponse.each_with_index do |responseObject, index|
|
207
|
+
currentQuery = self.allQuery[index];
|
208
|
+
responseKey = jsonResponse[index].keys[0];
|
209
|
+
queryKey = currentQuery.keys[0];
|
210
|
+
if (responseKey != queryKey)
|
211
|
+
raise 'UnexpectedResultException!
|
212
|
+
result ' + String(queryKey) + ' expected, but ' + String(responseKey) + ' given on position ' + String(index) +
|
213
|
+
' - query: ' + currentQuery.to_json
|
214
|
+
end
|
215
|
+
|
216
|
+
if !(self.mapping.has_key?(responseKey))
|
217
|
+
raise 'UnexpectedResultException! internal error, ' + String(responseKey) + ' is unknown result'
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def parseResult(jsonResponse, isMultiRequest=true)
|
223
|
+
|
224
|
+
self.checkResponse(jsonResponse)
|
225
|
+
results = Array(nil)
|
226
|
+
queryIds = Array(nil)
|
227
|
+
self.allQuery.each do |query|
|
228
|
+
queryIds.push(query.keys[0])
|
229
|
+
end
|
230
|
+
|
231
|
+
jsonResponse.each_with_index do |responseObject, index|
|
232
|
+
currentQuery = self.allQuery[index]
|
233
|
+
resultKey = responseObject.keys[0]
|
234
|
+
jsonObject = responseObject[resultKey]
|
235
|
+
queryKey = currentQuery.keys[0]
|
236
|
+
factory = self.factory
|
237
|
+
if (jsonObject['error_code'])
|
238
|
+
result = factory.preHandleError(jsonObject, resultKey, isMultiRequest);
|
239
|
+
if (result != false)
|
240
|
+
results.push(Hash[resultKey=> result])
|
241
|
+
next
|
242
|
+
end
|
243
|
+
end
|
244
|
+
query = currentQuery[queryKey];
|
245
|
+
queryId = queryIds[index];
|
246
|
+
if (queryId == QUERY_FACETS)
|
247
|
+
factory.updateFacetManager(jsonObject, query);
|
248
|
+
elsif (queryId == QUERY_TREE)
|
249
|
+
factory.initializeCategoryManager(jsonObject);
|
250
|
+
else
|
251
|
+
method = self.mapping[resultKey];
|
252
|
+
result = factory.send(method, jsonObject, query)
|
253
|
+
results.push(result)
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
return results;
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|