public function search($alias, $queryData = array()) { $dataset = $this->find('first', array('conditions' => array('Dataset.alias' => $alias), 'full' => 1)); $__fields = array('_date', '_title', '_weight'); $__orders = $__fields; $_fields = $__fields; foreach (array_column($dataset['fields'], 'fields') as $field) { $_field = $field['field']; if ($field['alias'] == $alias) { $_fields[] = $_field; } $_fields[] = $field['alias'] . '.' . $_field; } reset($field); foreach (array_column($dataset['orders_es'], 'sorting') as $field) { $_field = $field['field']; $__orders[] = $_field; $__orders[] = $alias . '.' . $_field; } $requested_fields = array(); // debug( $_fields ); die(); if (isset($queryData['fields']) && !empty($queryData['fields'])) { foreach ($queryData['fields'] as $field) { if (strpos($field, '.') === false) { $field = $alias . '.' . $field; } if (in_array($field, $_fields)) { $requested_fields[] = 'data.' . $field; } elseif ($field == 'sejm_wystapienia.data') { // TEMP HACK $requested_fields[] = 'data.' . $field; } } } // debug( $requested_fields ); die(); $virtual_fields = $dataset['virtual_fields']; $filters = array('dataset' => $alias); $switchers = array(); $facets = array(); $order = array(); $q = false; $mode = isset($queryData['mode']) && $queryData['mode'] ? $queryData['mode'] : null; $do_facets = isset($queryData['facets']) && $queryData['facets'] ? true : false; $limit = isset($queryData['limit']) && $queryData['limit'] ? $queryData['limit'] : 20; $page = isset($queryData['page']) && $queryData['page'] ? $queryData['page'] : 1; $version = isset($dataset['Dataset']['version']) && $dataset['Dataset']['version'] ? $dataset['Dataset']['version'] : false; if (isset($queryData['conditions']) && is_array($queryData['conditions'])) { foreach ($queryData['conditions'] as $key => $value) { if (in_array($key, array('page', 'limit'))) { continue; } if ($key[0] == '!') { $switchers[substr($key, 1)] = $value; } elseif ($key == 'q') { $q = $value; } elseif (in_array($key, $_fields)) { if (!in_array($key, $__fields) && strpos($key, '.') === false) { $key = $alias . '.' . $key; } $filters[$key] = $value; } elseif ($key == '_source') { $filters[$key] = $value; } } } if (isset($queryData['q'])) { $q = $queryData['q']; } if (!empty($switchers)) { $dataset_switchers_exp_dict = array_column($dataset['switchers'], 'switcher'); $dataset_switchers_exp_dict = array_column($dataset_switchers_exp_dict, 'filters', 'name'); foreach ($switchers as $key => $value) { if ($_filters = $dataset_switchers_exp_dict[$key]) { if (!empty($_filters[0])) { foreach ($_filters[0] as $_k => $_v) { if (strpos($_k, '.') === false) { $_k = $alias . '.' . $_k; } $filters[$_k] = $_v; } } /* if( $parts = explode(':', $exp) ) { if( stripos($parts[0], '_data_') === 0 ) $parts[0] = substr($parts[0] , 6); $filters[ $parts[0] ] = array($parts[1], false); } */ } } } if ($do_facets) { $facets_dict = array(); if (isset($dataset['filters'])) { foreach ($dataset['filters'] as $filter) { if (($filter = $filter['filter']) && in_array($filter['typ_id'], array(1, 2))) { if (strpos($filter['field'], '.') === false) { $filter['field'] = $alias . '.' . $filter['field']; } $facets[] = $filter['field']; $facets_dict[$filter['field']] = $filter; } } } } $_order = array(); if (isset($queryData['order']) && $queryData['order']) { $order = $queryData['order']; } if (is_string($order)) { $order = array($order); } foreach ($order as $o) { $_field = $o; if ($p = strpos($o, ' ')) { $_field = substr($o, 0, $p); } if (in_array($_field, $_fields) && (in_array($_field, $__orders) || mpapi_get_field_type($_field) != 'string')) { if (!in_array($_field, $__fields) && strpos($_field, '.') === false) { $o = $alias . '.' . $o; } $_order[] = $o; } } App::import('model', 'Dane.Dataobject'); $this->Dataobject = new Dataobject(); $search = $this->Dataobject->find('all', array('q' => $q, 'mode' => $mode, 'filters' => $filters, 'facets' => $facets, 'order' => $_order, 'limit' => $limit, 'page' => $page, 'version' => $version, 'fields' => $requested_fields)); if (isset($search['facets'])) { App::import('model', 'DB'); $this->DB = new DB(); $facets = array(); foreach ($search['facets'] as $field => $buckets) { $filter = $facets_dict[$field]; $buckets = $buckets[0]; $options = array(); if ($filter['typ_id'] == '1') { $ids = array(); foreach ($buckets as $b) { if ($b['key'] && $b['doc_count']) { $ids[] = $b['key']; } } if (isset($filter['params']['table'])) { $id_field = isset($filter['params']['id_field']) ? $filter['params']['id_field'] : 'id'; $title_field = isset($filter['params']['title_field']) ? $filter['params']['title_field'] : 'nazwa'; $table = $filter['params']['table']; $data = $this->DB->selectAssocs("SELECT `{$id_field}` as 'id', `{$title_field}` as 'label' FROM `{$table}` WHERE `{$id_field}`='" . implode("' OR `{$id_field}`='", $ids) . "'"); $data = array_column($data, 'label', 'id'); foreach ($buckets as $b) { $options[] = array('id' => $b['key'], 'count' => $b['doc_count'], 'label' => array_key_exists($b['key'], $data) ? $data[$b['key']] : ' - '); } $filter['params'] = array('options' => $options); } } elseif ($filter['typ_id'] == '2') { $data = array_column($buckets, 'doc_count', 'key'); for ($i = 0; $i < count($filter['params']['options']); $i++) { $filter['params']['options'][$i]['count'] = @$data[strtolower($filter['params']['options'][$i]['id'])]; } } $facets[] = $filter; } $search['facets'] = $facets; } return $search; }
$properties = array(); // get fields based on sample object $sample_object = file_get_contents($api_root . 'dane/' . $slug . '?limit=1'); $sample_object = json_decode($sample_object, true); $sample_object = $sample_object['Dataobject'][0]; $sample_object = file_get_contents($api_root . 'dane/' . $slug . '/' . $sample_object['id'] . '?layers=*'); $sample_object = json_decode($sample_object, true); file_put_contents($output_directory . $slug . '_example.json', json_format($sample_object)); foreach ($sample_object['data'] as $field => $v) { list($dataset, $fld) = preg_split('/\\./', $field); if ($dataset == null or $fld == null) { throw new Exception("Wrong field format " . $field); } $fdef = array('type' => 'string', 'description' => 'TODO'); // guess type, @see Vendor/functions.php $estype = mpapi_get_field_type($fld); switch ($estype) { case 'date': $fdef['type'] = 'string'; $fdef['format'] = 'date-time'; break; case 'bigint': case 'int': $fdef['type'] = 'integer'; break; case 'float': $fdef['type'] = 'number'; break; } $properties[$field] = $fdef; }