AntonLV 9 yıl önce
ebeveyn
işleme
dde1038d02

+ 23 - 3
modules/boonex/elasticsearch/classes/BxElsApi.php

@@ -22,7 +22,17 @@ class BxElsApi extends BxDol
 
     public function __construct()
     {
-        $this->_sApiUrl = 'http://45.56.80.210:9200'; // TODO: use $this->_sApiUrl = getParam(''); 
+        $this->_sApiUrl = getParam('bx_elasticsearch_api_url');
+    }
+
+    public function searchData($sIndex, $sTerm) 
+    {
+        return $this->api("/$sIndex/_search?q=" . $sTerm);
+    }
+
+    public function getData($sIndex, $sType, $iContentId) 
+    {
+        return $this->api("/$sIndex/$sType/$iContentId");
     }
 
     public function indexData($sIndex, $sType, $iContentId, $aData) 
@@ -30,6 +40,16 @@ class BxElsApi extends BxDol
         return $this->api("/$sIndex/$sType/$iContentId", $aData, 'put');
     }
 
+    public function updateData($sIndex, $sType, $iContentId, $aData)
+    {
+        return $this->api("/$sIndex/$sType/$iContentId", $aData, 'post');
+    }
+
+    public function deleteData($sIndex, $sType, $iContentId)
+    {
+        return $this->api("/$sIndex/$sType/$iContentId", array(), 'delete');
+    }
+
     public function getErrorMsg() 
     {
         return $this->_sError;
@@ -102,7 +122,7 @@ class BxElsApi extends BxDol
 
         if ($aData) {
             curl_setopt($rConnect, CURLOPT_POSTFIELDS, json_encode($aData));
-            curl_setopt($rConnect, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
+            curl_setopt($rConnect, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
         }
 
         $sResult = curl_exec($rConnect);
@@ -115,7 +135,7 @@ class BxElsApi extends BxDol
         return $sResult;
     }
 
-    public function log ($mixed, $sProvider = '')
+    protected function log ($mixed, $sProvider = '')
     {
         if (!defined('BX_ELASTICSEARCH_LOG') || !constant('BX_ELASTICSEARCH_LOG'))
             return;

+ 14 - 0
modules/boonex/elasticsearch/classes/BxElsConfig.php

@@ -19,8 +19,22 @@ class BxElsConfig extends BxBaseModGeneralConfig
 
             // module icon
             'ICON' => 'search col-blue2',
+
+            // database fields
+            'FIELD_AUTHOR' => 'author',
+            'FIELD_ADDED' => 'added',
+            'FIELD_CHANGED' => 'changed',
+        	'FIELD_LINK' => 'link',
+            'FIELD_TITLE' => 'title',
+            'FIELD_TEXT' => 'text',
         );
     }
+
+    public function getIndex()
+    {
+        $aUrl = parse_url(BX_DOL_URL_ROOT);
+        return $aUrl['host'];
+    }
 }
 
 /** @} */

+ 97 - 4
modules/boonex/elasticsearch/classes/BxElsModule.php

@@ -11,9 +11,14 @@
 
 class BxElsModule extends BxBaseModGeneralModule
 {
+    protected $_oApi;
+
     function __construct(&$aModule)
     {
         parent::__construct($aModule);
+
+        bx_import('Api', $aModule);
+        $this->_oApi = new BxElsApi();
     }
 
     public function actionDebug()
@@ -58,17 +63,105 @@ class BxElsModule extends BxBaseModGeneralModule
             var_dump($mixed);
         echo '</pre>';
     }
-    
-    public function serviceAdd($sString, $iLanguageId = 0, $iOrig = 1)
+
+    public function serviceSearch($sTerm, $sIndex = '')
+    {
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
+        $mixedResult = $this->_oApi->searchData($sIndex, $sTerm);
+        if(!$mixedResult || !is_array($mixedResult))
+            return false;
+
+        return $mixedResult['hits'];
+    }
+
+    public function serviceGet($iContentId, $sType, $sIndex = '')
     {
+        if(empty($sIndex))
+            $sIndex = $this->_oConfig->getIndex();
+
+        return $this->_oApi->getData($sIndex, $sType, $iContentId);
+    }
+
+    public function serviceAdd($iContentId, $mixedContenInfo)
+    {
+        if(is_array($mixedContenInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
+            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        }
+
+        if(!($mixedContenInfo instanceof BxDolContentInfo))
+            return false;
+
+        $CNF = &$this->_oConfig->CNF;
+
+        $aInfo = array(
+            $CNF['FIELD_AUTHOR'] => $mixedContenInfo->getContentAuthor($iContentId),
+            $CNF['FIELD_ADDED'] => $mixedContenInfo->getContentDateAdded($iContentId),
+            $CNF['FIELD_CHANGED'] => $mixedContenInfo->getContentDateChanged($iContentId),
+            $CNF['FIELD_LINK'] => $mixedContenInfo->getContentLink($iContentId),
+            $CNF['FIELD_TITLE'] => $mixedContenInfo->getContentTitle($iContentId),
+            $CNF['FIELD_TEXT'] => $mixedContenInfo->getContentDesc($iContentId),
+        );
+        $aInfo = array_merge($aInfo, $mixedContenInfo->getContentInfo($iContentId));
+
+        $mixedResult = $this->_oApi->indexData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId, $aInfo);
+        if($mixedResult === null)
+            return false;
+
+        return $mixedResult['result'] == 'created';
     }
 
-    public function serviceEdit($iKeyId, $sString, $iLanguageId = 0, $bMarkAsOrig = false, $bRemoveOther = false)
+    public function serviceUpdate($iContentId, $mixedContenInfo)
     {
+        if(is_array($mixedContenInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
+            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        }
+
+        if(!($mixedContenInfo instanceof BxDolContentInfo))
+            return false;
+
+        $CNF = &$this->_oConfig->CNF;
+
+        $aInfo = array(
+            $CNF['FIELD_AUTHOR'] => $mixedContenInfo->getContentAuthor($iContentId),
+            $CNF['FIELD_ADDED'] => $mixedContenInfo->getContentDateAdded($iContentId),
+            $CNF['FIELD_CHANGED'] => $mixedContenInfo->getContentDateChanged($iContentId),
+            $CNF['FIELD_LINK'] => $mixedContenInfo->getContentLink($iContentId),
+            $CNF['FIELD_TITLE'] => $mixedContenInfo->getContentTitle($iContentId),
+            $CNF['FIELD_TEXT'] => $mixedContenInfo->getContentDesc($iContentId),
+        );
+        $aInfo = array_merge($aInfo, $mixedContenInfo->getContentInfo($iContentId));
+
+        $mixedResult = $this->_oApi->updateData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId, $aInfo);
+        if($mixedResult === null)
+            return false;
+
+        return $mixedResult['result'] == 'updated';
     }
 
-    public function serviceDelete($iKeyId)
+    public function serviceDelete($iContentId, $mixedContenInfo)
     {
+        if(is_array($mixedContenInfo)) {
+            $sMethod = 'getObjectInstanceByAlert' . bx_gen_method_name($mixedContenInfo['alert_type']);
+            $mixedContenInfo = BxDolContentInfo::$sMethod($mixedContenInfo['unit'], $mixedContenInfo['action']);
+        }
+
+        if(!($mixedContenInfo instanceof BxDolContentInfo))
+            return false;
+
+        $CNF = &$this->_oConfig->CNF;
+
+        bx_import('Api', $this->_aModule);
+        $oApi = new BxElsApi();
+
+        $mixedResult = $oApi->deleteData($this->_oConfig->getIndex(), $mixedContenInfo->getName(), $iContentId);
+        if($mixedResult === null)
+            return false;
+
+        return $mixedResult['result'] == 'deleted';
     }
 }
 

+ 12 - 0
modules/boonex/elasticsearch/classes/BxElsResponse.php

@@ -24,6 +24,18 @@ class BxElsResponse extends BxDolAlertsResponse
 
     public function response($oAlert)
     {
+        $aAlertTypes = array('add', 'update', 'delete');
+        foreach($aAlertTypes as $sAlertType) {
+            $sMethodType = bx_gen_method_name($sAlertType);
+
+            $sMethod = 'getObjectInstanceByAlert' . $sMethodType;
+            $oContentInfo = BxDolContentInfo::$sMethod($oAlert->sUnit, $oAlert->sAction);
+            if(!$oContentInfo)
+                continue;
+
+            $sMethod = 'service' . $sMethodType;
+            $this->_oModule->$sMethod($oAlert->iObject, $oContentInfo);
+        }
         
     }
 }

+ 1 - 2
modules/boonex/elasticsearch/install/config.php

@@ -54,11 +54,10 @@ $aConfig = array(
     ),
     'enable' => array(
         'execute_sql' => 1,
-    	'process_form_check_functions' => 1,    //Note. It's essential to make this action AFTER 'execute_sql' one.
+    	'process_content_alerts' => 1,    //Note. It's essential to make this action AFTER 'execute_sql' one.
         'clear_db_cache' => 1,
     ),
     'disable' => array (
-    	'process_form_check_functions' => 1,    //Note. It's essential to make this action BEFORE 'execute_sql' one.
         'execute_sql' => 1,
         'clear_db_cache' => 1,
     ),

+ 35 - 0
modules/boonex/elasticsearch/install/installer.php

@@ -11,9 +11,44 @@
 
 class BxElsInstaller extends BxDolStudioInstaller
 {
+    protected $_oDb;
+
     function __construct($aConfig)
     {
         parent::__construct($aConfig);
+
+        $this->_aActions = array_merge($this->_aActions, array(
+        	'process_content_alerts' => array(
+				'title' => 'Process content alerts',
+            ),
+        ));
+
+        $this->_oDb = BxDolDb::getInstance();
+    }
+
+    public function actionProcessContentAlerts($sOperation)
+    {
+        if($sOperation != 'enable')
+            return BX_DOL_STUDIO_INSTALLER_SUCCESS;
+
+        $aCiObjects = BxDolContentInfo::getSystems();
+        if(empty($aCiObjects) || !is_array($aCiObjects))
+            return BX_DOL_STUDIO_INSTALLER_SUCCESS;
+
+        $iHandlerId = $this->_oDb->getOne("SELECT `id` FROM `sys_alerts_handlers` WHERE `name`=:name", array(
+            'name' => $this->_aConfig['name']
+        ));
+
+        $aActions = array('add', 'update', 'delete');
+        foreach($aCiObjects as $aCiObject)
+            foreach($aActions as $sAction)
+                $this->_oDb->query("INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES (:unit, :action, :handler);", array(
+                    'unit' => $aCiObject['alert_unit'],
+                	'action' => $aCiObject['alert_action_' . $sAction],
+                    'handler' => $iHandlerId
+                ));
+
+        return BX_DOL_STUDIO_INSTALLER_SUCCESS;
     }
 }
 

+ 2 - 22
modules/boonex/elasticsearch/install/langs/en.xml

@@ -1,26 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources name="en" flag="gb" title="English">
-    <string name="_bx_mlc"><![CDATA[MLC]]></string>
+    <string name="_bx_elasticsearch"><![CDATA[ElasticSearch]]></string>
 
-    <string name="_bx_mlc_option_summary_chars"><![CDATA[Number of characters in auto-cropped discussion summary]]></string>
-
-    <string name="_bx_mlc_lmi_cpt_keys"><![CDATA[Keys]]></string>
-
-    <string name="_bx_mlc_form_strings_input_submit"><![CDATA[Submit]]></string>
-    <string name="_bx_mlc_form_strings_input_close"><![CDATA[Close]]></string>
-    <string name="_bx_mlc_form_strings_popup_edit"><![CDATA[Edit Key]]></string>
-
-    <string name="_bx_mlc_grid_column_title_key"><![CDATA[Key]]></string>
-    <string name="_bx_mlc_grid_column_title_string"><![CDATA[Text]]></string>
-    <string name="_bx_mlc_grid_column_title_languages"><![CDATA[Languages]]></string>
-    <string name="_bx_mlc_grid_action_title_delete"><![CDATA[Delete]]></string>
-    <string name="_bx_mlc_grid_action_alt_edit"><![CDATA[Edit key]]></string>
-    <string name="_bx_mlc_grid_action_alt_delete"><![CDATA[Delete key]]></string>
-    <string name="_bx_mlc_grid_action_err_perform"><![CDATA[Cannot perform the action. Please report.]]></string>
-
-    
-    <string name=""><![CDATA[]]></string>
-    <string name=""><![CDATA[]]></string>
-    <string name=""><![CDATA[]]></string>
-    <string name=""><![CDATA[]]></string>
+    <string name="_bx_elasticsearch_option_api_url"><![CDATA[API URL]]></string>
 </resources>

+ 5 - 20
modules/boonex/elasticsearch/install/sql/disable.sql

@@ -1,24 +1,9 @@
 
 -- SETTINGS
-DELETE FROM `top`, `toc`, `to` USING `sys_options_types` AS `top` LEFT JOIN `sys_options_categories` AS `toc` ON `top`.`id`=`toc`.`type_id` LEFT JOIN `sys_options` AS `to` ON `toc`.`id`=`to`.`category_id` WHERE `top`.`name` = 'bx_mlc';
+DELETE FROM `top`, `toc`, `to` USING `sys_options_types` AS `top` LEFT JOIN `sys_options_categories` AS `toc` ON `top`.`id`=`toc`.`type_id` LEFT JOIN `sys_options` AS `to` ON `toc`.`id`=`to`.`category_id` WHERE `top`.`name` = 'bx_elasticsearch';
 
 
--- GRID
-DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_mlc_keys');
-DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_mlc_keys');
-DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_mlc_keys');
-
-
--- FORM
-UPDATE `sys_form_inputs` SET `type`='text' WHERE `type`='text_mlc';
-UPDATE `sys_form_inputs` SET `type`='textarea' WHERE `type`='textarea_mlc';
-UPDATE `sys_form_inputs` SET `checker_func`='Avail' WHERE `checker_func`='AvailMlc';
-UPDATE `sys_form_inputs` SET `checker_func`='Length' WHERE `checker_func`='LengthMlc';
-
-
--- INJECTIONS
-DELETE FROM `sys_injections` WHERE `name`='bx_mlc';
-
-
--- CRON
-DELETE FROM `sys_cron_jobs` WHERE `name`='bx_mlc_translator';
+-- ALERTS
+SET @iHandlerId = (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = 'bx_elasticsearch' LIMIT 1);
+DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandlerId;
+DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandlerId LIMIT 1;

+ 10 - 33
modules/boonex/elasticsearch/install/sql/enable.sql

@@ -2,44 +2,21 @@
 -- SETTINGS
 SET @iTypeOrder = (SELECT MAX(`order`) FROM `sys_options_types` WHERE `group` = 'modules');
 INSERT INTO `sys_options_types` (`group`, `name`, `caption`, `icon`, `order`) VALUES 
-('modules', 'bx_mlc', '_bx_mlc', 'bx_mlc@modules/boonex/mlc/|std-icon.svg', IF(NOT ISNULL(@iTypeOrder), @iTypeOrder + 1, 1));
+('modules', 'bx_elasticsearch', '_bx_elasticsearch', 'bx_elasticsearch@modules/boonex/elasticsearch/|std-icon.svg', IF(NOT ISNULL(@iTypeOrder), @iTypeOrder + 1, 1));
 SET @iTypeId = LAST_INSERT_ID();
 
 INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `order` )  
-VALUES (@iTypeId, 'bx_mlc', '_bx_mlc', 1);
+VALUES (@iTypeId, 'bx_elasticsearch', '_bx_elasticsearch', 1);
 SET @iCategId = LAST_INSERT_ID();
 
---INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
---('bx_mlc_autoapproval', 'on', @iCategId, '_bx_mlc_option_autoapproval', 'checkbox', '', '', '', 1);
+INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
+('bx_elasticsearch_api_url', 'http://45.56.80.210:9200', @iCategId, '_bx_elasticsearch_option_api_url', 'digit', '', '', '', 1);
 
 
--- GRID
-INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
-('bx_mlc_keys', 'Sql', 'SELECT `tlk`.`id` AS `id`, `tlk`.`id` AS `key`, `tls`.`string` AS `string` FROM `bx_mlc_keys` AS `tlk` LEFT JOIN `bx_mlc_strings` AS `tls` ON `tlk`.`id`=`tls`.`key_id` WHERE `tls`.`orig`=\'1\' ', 'bx_mlc_keys', 'id', '', '', 20, NULL, 'start', '', 'string', '', 'like', 'string', 128, 'BxMlcGridKeys', 'modules/boonex/mlc/classes/BxMlcGridKeys.php');
+-- ALERTS
+INSERT INTO `sys_alerts_handlers`(`name`, `class`, `file`, `service_call`) VALUES 
+('bx_elasticsearch', 'BxElsResponse', 'modules/boonex/elasticsearch/classes/BxElsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
 
-INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `translatable`, `chars_limit`, `params`, `order`) VALUES
-('bx_mlc_keys', 'checkbox', '', '2%', 0, '', '', 1),
-('bx_mlc_keys', 'key', '_bx_mlc_grid_column_title_key', '25%', 0, '16', '', 2),
-('bx_mlc_keys', 'string', '_bx_mlc_grid_column_title_string', '38%', 0, '32', '', 3),
-('bx_mlc_keys', 'languages', '_bx_mlc_grid_column_title_languages', '15%', 0, '', '', 4),
-('bx_mlc_keys', 'actions', '', '20%', 0, '', '', 5);
-
-INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `icon_only`, `confirm`, `order`) VALUES
-('bx_mlc_keys', 'bulk', 'delete', '_bx_mlc_grid_action_title_delete', '', 0, 1, 1),
-('bx_mlc_keys', 'single', 'edit', '_bx_mlc_grid_action_alt_edit', 'pencil', 1, 0, 1),
-('bx_mlc_keys', 'single', 'delete', '_bx_mlc_grid_action_alt_delete', 'remove', 1, 1, 2);
-
-
--- FORM
-UPDATE `sys_form_inputs` SET `type`='text_mlc' WHERE `type`='text' AND `module` NOT IN ('bx_developer', 'bx_payment') AND `object` NOT IN ('sys_login', 'sys_account', 'sys_forgot_password') AND `name` NOT IN ('email', 'keyword', 'price_single', 'trial_recurring') AND `checker_func` NOT IN ('EmailUniq', 'EmailExist');
-UPDATE `sys_form_inputs` SET `type`='textarea_mlc' WHERE `type`='textarea' AND `module` NOT IN ('bx_developer', 'bx_payment');
-
-
--- INJECTIONS
-INSERT INTO `sys_injections` (`name`, `page_index`, `key`, `type`, `data`, `replace`, `active`) VALUES
-('bx_mlc', 0, 'injection_head', 'service', 'a:2:{s:6:"module";s:6:"bx_mlc";s:6:"method";s:14:"include_css_js";}', 0, 1);
-
-
--- CRON
-INSERT INTO `sys_cron_jobs` (`name`, `time`, `class`, `file`, `service_call`) VALUES
-('bx_mlc_translator', '* * * * *', 'BxMlcCronTranslator', 'modules/boonex/mlc/classes/BxMlcCronTranslator.php', '');
+--INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+--('profile', 'delete', @iHandler);

+ 2 - 18
modules/boonex/elasticsearch/install/sql/install.sql

@@ -1,28 +1,12 @@
 
--- Tables
-CREATE TABLE IF NOT EXISTS `bx_mlc_keys` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  PRIMARY KEY (`id`)
-);
-
-CREATE TABLE IF NOT EXISTS `bx_mlc_strings` (
-  `key_id` int(11) NOT NULL DEFAULT '0',
-  `language_id` int(11) unsigned NOT NULL DEFAULT '0',
-  `string` text NOT NULL DEFAULT '',
-  `orig` tinyint(4) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`key_id`,`language_id`),
-  FULLTEXT KEY `string` (`string`)
-);
-
-
 -- Studio page and widget
 INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
-(3, 'bx_mlc', '_bx_mlc', '_bx_mlc', 'bx_mlc@modules/boonex/mlc/|std-icon.svg');
+(3, 'bx_elasticsearch', '_bx_elasticsearch', '_bx_elasticsearch', 'bx_elasticsearch@modules/boonex/elasticsearch/|std-icon.svg');
 SET @iPageId = LAST_INSERT_ID();
 
 SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
 SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
 INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
-(@iPageId, 'bx_mlc', '{url_studio}module.php?name=bx_mlc&page=settings', '', 'bx_mlc@modules/boonex/mlc/|std-icon.svg', '_bx_mlc', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
+(@iPageId, 'bx_elasticsearch', '{url_studio}module.php?name=bx_elasticsearch&page=settings', '', 'bx_elasticsearch@modules/boonex/elasticsearch/|std-icon.svg', '_bx_elasticsearch', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
 INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
 (@iParentPageId, LAST_INSERT_ID(), IF(ISNULL(@iParentPageOrder), 1, @iParentPageOrder + 1));

+ 1 - 5
modules/boonex/elasticsearch/install/sql/uninstall.sql

@@ -1,9 +1,5 @@
 
--- Tables
-DROP TABLE IF EXISTS `bx_mlc_keys`, `bx_mlc_strings`;
-
-
 -- Studio page and widget
 DELETE FROM `tp`, `tw`, `tpw`
 USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`
-WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = 'bx_mlc';
+WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = 'bx_elasticsearch';

+ 70 - 186
modules/boonex/elasticsearch/template/images/icons/std-icon.svg

@@ -1,199 +1,83 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<svg width="600px" height="600px" viewBox="0 0 600 600" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 40.3 (33839) - http://www.bohemiancoding.com/sketch -->
-    <title>Group 2 Copy 13</title>
-    <desc>Created with Sketch.</desc>
+<svg width="606px" height="606px" viewBox="0 0 606 606" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>elasticsearch</title>
+    <style type="text/css">
+	.st0{clip-path:url(#SVGID_2_);fill:#F0BF1A;}
+	.st1{clip-path:url(#SVGID_4_);fill:#3EBEB0;}
+	.st2{clip-path:url(#SVGID_6_);fill:#07A5DE;}
+	.st3{clip-path:url(#SVGID_8_);fill:#231F20;}
+	.st4{fill:#D7A229;}
+	.st5{fill:#019B8F;}
+	.st6{fill:none;}
+    </style>
     <defs>
         <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
             <stop stop-color="#FFFFFF" stop-opacity="0.2" offset="0%"></stop>
-            <stop stop-color="#000000" stop-opacity="0.138870018" offset="100%"></stop>
+            <stop stop-color="#000000" stop-opacity="0.2" offset="100%"></stop>
         </linearGradient>
-        <linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-2">
-            <stop stop-color="#FFFFFF" offset="0%"></stop>
-            <stop stop-color="#F6F6F6" offset="35.2427758%"></stop>
-            <stop stop-color="#E5E5E5" offset="100%"></stop>
-        </linearGradient>
-        <path d="M200,0 L199.807692,0 C199.807692,0 199.807692,0 199.711538,0 L199.519231,0 C89.2307692,0.288461538 0,89.7115385 0,200 C0,310.288462 89.2307692,399.711538 199.519231,400 L199.711538,400 L199.807692,400 L200,400 C310.480769,400 400,310.480769 400,200 C400,89.5192308 310.480769,0 200,0 L200,0 Z M200,384.038462 L199.807692,384.038462 C199.807692,384.038462 199.807692,384.038462 199.711538,384.038462 L199.519231,384.038462 C98.1730769,383.75 15.9615385,301.442308 15.9615385,200 C15.9615385,98.5576923 98.0769231,16.25 199.519231,16.0576923 L199.711538,16.0576923 L199.807692,16.0576923 L200,16.0576923 C301.634615,16.0576923 384.038462,98.4615385 384.038462,200.096154 C384.038462,301.634615 301.634615,384.038462 200,384.038462 L200,384.038462 Z" id="path-3"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-4">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M263.75,119.038462 C245.769231,123.365385 227.211538,125.961538 208.076923,126.538462 L208.076923,192.019231 L273.076923,192.019231 C272.5,165 269.134615,140.480769 263.75,119.038462 L263.75,119.038462 Z" id="path-5"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-6">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M207.980769,33.1730769 L207.980769,111.923077 C225.769231,111.346154 243.076923,109.038462 259.711538,105 C247.115385,65.1923077 227.5,39.0384615 207.980769,33.1730769 L207.980769,33.1730769 Z" id="path-7"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-8">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M139.807692,104.903846 C156.634615,108.942308 174.038462,111.346154 191.923077,111.923077 L191.923077,32.9807692 C172.403846,38.6538462 152.5,64.8076923 139.807692,104.903846 L139.807692,104.903846 Z" id="path-9"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-10">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M319.807692,82.1153846 C298.076923,60 270.288462,43.8461538 239.134615,36.4423077 C253.365385,51.1538462 265.288462,73.6538462 273.846154,101.153846 C289.903846,96.25 305.288462,89.9038462 319.807692,82.1153846 L319.807692,82.1153846 Z" id="path-11"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-12">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M287.788462,192.019231 L367.884615,192.019231 C366.153846,154.711538 352.211538,120.480769 329.903846,93.3653846 C313.461538,102.403846 296.057692,109.807692 277.884615,115.288462 C283.75,138.365385 287.211538,164.423077 287.788462,192.019231 L287.788462,192.019231 Z" id="path-13"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-14">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M126.442308,192.019231 L192.019231,192.019231 L192.019231,126.538462 C172.692308,125.961538 153.942308,123.365385 135.865385,118.942308 C130.384615,140.384615 127.019231,165 126.442308,192.019231 L126.442308,192.019231 Z" id="path-15"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-16">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M273.076923,207.980769 L207.980769,207.980769 L207.980769,273.365385 C227.115385,273.942308 245.769231,276.442308 263.75,280.865385 C269.134615,259.519231 272.5,234.903846 273.076923,207.980769 L273.076923,207.980769 Z" id="path-17"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-18">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M135.865385,280.961538 C153.942308,276.538462 172.692308,273.942308 192.019231,273.365385 L192.019231,207.980769 L126.442308,207.980769 C127.019231,235 130.384615,259.615385 135.865385,280.961538 L135.865385,280.961538 Z" id="path-19"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-20">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M192.019231,366.923077 L192.019231,287.980769 C174.134615,288.557692 156.634615,290.961538 139.807692,295 C152.5,335.096154 172.403846,361.346154 192.019231,366.923077 L192.019231,366.923077 Z" id="path-21"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-22">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M239.134615,363.557692 C270.288462,356.057692 298.076923,340 319.903846,317.788462 C305.384615,310 290,303.653846 273.942308,298.75 C265.384615,326.346154 253.365385,348.75 239.134615,363.557692 L239.134615,363.557692 Z" id="path-23"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-24">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M160.288462,36.6346154 C129.423077,44.1346154 101.826923,60.1923077 80.1923077,82.2115385 C94.6153846,89.9038462 109.807692,96.25 125.673077,101.057692 C134.230769,73.6538462 146.153846,51.3461538 160.288462,36.6346154 L160.288462,36.6346154 Z" id="path-25"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-26">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M277.884615,284.711538 C296.153846,290.192308 313.557692,297.596154 330,306.634615 C352.307692,279.519231 366.25,245.288462 367.980769,207.980769 L287.884615,207.980769 C287.211538,235.576923 283.75,261.538462 277.884615,284.711538 L277.884615,284.711538 Z" id="path-27"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-28">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M207.980769,287.980769 L207.980769,366.826923 C227.5,360.961538 247.115385,334.807692 259.711538,294.903846 C243.076923,290.865385 225.769231,288.557692 207.980769,287.980769 L207.980769,287.980769 Z" id="path-29"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-30">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M121.730769,115.192308 C103.653846,109.711538 86.3461538,102.403846 70.0961538,93.3653846 C47.7884615,120.480769 33.8461538,154.711538 32.1153846,192.019231 L111.826923,192.019231 C112.307692,164.326923 115.865385,138.269231 121.730769,115.192308 L121.730769,115.192308 Z" id="path-31"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-32">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M111.730769,207.980769 L32.0192308,207.980769 C33.75,245.288462 47.6923077,279.519231 70,306.634615 C86.25,297.692308 103.557692,290.288462 121.634615,284.807692 C115.865385,261.730769 112.307692,235.673077 111.730769,207.980769 L111.730769,207.980769 Z" id="path-33"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-34">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
-        <path d="M80.0961538,317.788462 C101.730769,339.807692 129.326923,355.865385 160.288462,363.365385 C146.153846,348.653846 134.230769,326.25 125.673077,298.846154 C109.807692,303.75 94.5192308,310.096154 80.0961538,317.788462 L80.0961538,317.788462 Z" id="path-35"></path>
-        <filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-36">
-            <feMorphology radius="1" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1"></feMorphology>
-            <feOffset dx="0" dy="2" in="shadowSpreadOuter1" result="shadowOffsetOuter1"></feOffset>
-            <feColorMatrix values="0 0 0 0 0   0 0 0 0 0   0 0 0 0 0  0 0 0 0.08 0" type="matrix" in="shadowOffsetOuter1"></feColorMatrix>
-        </filter>
     </defs>
     <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Group-2-Copy-13">
-            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path-copy-14" fill="#FF4D63"></path>
-            <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 L552.268958,552.268958 Z" id="path-copy" fill="url(#linearGradient-1)"></path>
-            <g id="ios-world" transform="translate(100.000000, 104.000000)">
-                <g id="Layer_1">
-                    <g id="Group">
-                        <g id="Shape">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-3"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-6)" xlink:href="#path-5"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-5"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-8)" xlink:href="#path-7"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-7"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-10)" xlink:href="#path-9"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-9"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-12)" xlink:href="#path-11"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-11"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-14)" xlink:href="#path-13"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-13"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-16)" xlink:href="#path-15"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-15"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-18)" xlink:href="#path-17"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-17"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-20)" xlink:href="#path-19"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-19"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-22)" xlink:href="#path-21"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-21"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-24)" xlink:href="#path-23"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-23"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-26)" xlink:href="#path-25"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-25"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-28)" xlink:href="#path-27"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-27"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-30)" xlink:href="#path-29"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-29"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-32)" xlink:href="#path-31"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-31"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-34)" xlink:href="#path-33"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-33"></use>
-                        </g>
-                        <g id="Shape" opacity="0.5">
-                            <use fill="black" fill-opacity="1" filter="url(#filter-36)" xlink:href="#path-35"></use>
-                            <use fill="url(#linearGradient-2)" fill-rule="evenodd" xlink:href="#path-35"></use>
-                        </g>
+        <g id="shopify" transform="translate(3.000000, 3.000000)">
+            <g id="Squircle2-Copy-6" fill-rule="nonzero">
+                <g id="Shape">
+                    <g id="path-2-link" fill="#FFFFFF">
+                        <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 Z" id="path-2"></path>
+                    </g>
+                    <g id="path-2-link" stroke="#000000" stroke-width="4.04" fill="url(#linearGradient-1)">
+                        <path d="M552.268958,552.268958 C600,504.537813 600,431.458333 600,300 C600,168.541667 600,95.4621875 552.268958,47.7310417 C504.537813,0 431.458333,0 300,0 C168.541667,0 95.4621875,0 47.7310417,47.7310417 C0,95.4621875 0,168.541667 0,300 C0,431.458333 0,504.537813 47.7310417,552.268958 C95.4621875,600 168.541667,600 300,600 C431.458333,600 504.537813,600 552.268958,552.268958 Z" id="path-2"></path>
                     </g>
                 </g>
             </g>
+            <g id="elasticsearch-logo-default" opacity="0.9" transform="translate(80.000000, 60.000000) scale(6,6)">
+                <g>
+			<g>
+				<g>
+					<defs>
+						<circle id="SVGID_1_" cx="40" cy="40" r="32"/>
+					</defs>
+					<clipPath id="SVGID_2_">
+						<use xlink:href="#SVGID_1_"  style="overflow:visible;"/>
+					</clipPath>
+					<path class="st0" d="M53.7,26H10c-1.1,0-2-0.9-2-2V10c0-1.1,0.9-2,2-2h57c1.1,0,2,0.9,2,2v0.7C68.9,19.1,62.1,26,53.7,26z"/>
+				</g>
+			</g>
+			<g>
+				<g>
+					<defs>
+						<circle id="SVGID_3_" cx="40" cy="40" r="32"/>
+					</defs>
+					<clipPath id="SVGID_4_">
+						<use xlink:href="#SVGID_3_"  style="overflow:visible;"/>
+					</clipPath>
+					<path class="st1" d="M69.1,72H8.2l0,0V54l0,0h45.7c8.4,0,15.2,6.8,15.2,15.2V72L69.1,72z"/>
+				</g>
+			</g>
+			<g>
+				<g>
+					<defs>
+						<circle id="SVGID_5_" cx="40" cy="40" r="32"/>
+					</defs>
+					<clipPath id="SVGID_6_">
+						<use xlink:href="#SVGID_5_"  style="overflow:visible;"/>
+					</clipPath>
+					<path class="st2" d="M50.1,49H4.8V31h45.3c5,0,9,4,9,9l0,0C59.1,45,55,49,50.1,49z"/>
+				</g>
+			</g>
+			<g>
+				<g>
+					<defs>
+						<circle id="SVGID_7_" cx="40" cy="40" r="32"/>
+					</defs>
+					<clipPath id="SVGID_8_">
+						<use xlink:href="#SVGID_7_"  style="overflow:visible;"/>
+					</clipPath>
+					<path class="st3" d="M36,31H6.4v18H36c0.7-2.7,1.1-5.7,1.1-9S36.7,33.7,36,31z"/>
+				</g>
+			</g>
+		</g>
+		<path class="st4" d="M23.9,12.3c-5.4,3.2-9.9,8-12.7,13.7h23.6C32.4,20.5,28.6,15.9,23.9,12.3z"/>
+		<path class="st5" d="M24.9,68.2c4.6-3.7,8.3-8.6,10.6-14.2H11.2C14.2,60,19,65,24.9,68.2z"/>
+            </g>
         </g>
     </g>
 </svg>