You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ol...@apache.org on 2018/11/28 10:55:42 UTC

[ambari-logsearch] branch master updated: AMBARI-24939. Refactor logsearch_metadata schama and usage for logsearch portal (#47)

This is an automated email from the ASF dual-hosted git repository.

oleewere pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ambari-logsearch.git


The following commit(s) were added to refs/heads/master by this push:
     new 2500713  AMBARI-24939. Refactor logsearch_metadata schama and usage for logsearch portal (#47)
2500713 is described below

commit 2500713b0c24169b4eea207aead3a5e74c2aceec
Author: Olivér Szabó <ol...@gmail.com>
AuthorDate: Wed Nov 28 11:55:38 2018 +0100

    AMBARI-24939. Refactor logsearch_metadata schama and usage for logsearch portal (#47)
---
 .../config/solr/LogLevelFilterManagerSolr.java     |  20 ++-
 .../logfeeder/common/LogFeederConstants.java       |   4 -
 .../logsearch_metadata/conf/managed-schema         |   7 +-
 .../logsearch/common/LogSearchConstants.java       |   5 +-
 .../converter/MetadataRequestQueryConverter.java   |  28 ++--
 .../ambari/logsearch/dao/MetadataSolrDao.java      |   4 +-
 .../apache/ambari/logsearch/doc/DocConstants.java  |  12 +-
 .../ambari/logsearch/manager/MetadataManager.java  | 154 +++++++--------------
 .../model/request/MetadataParamDefinition.java     |  22 +--
 .../model/request/impl/MetadataRequest.java        |   3 +-
 .../request/impl/query/MetadataQueryRequest.java   |  57 ++++++--
 .../response/LogSearchMetaDataListResponse.java    |  55 --------
 .../model/response/LogsearchMetaData.java          |  42 ++----
 .../ambari/logsearch/rest/MetadataResource.java    |  26 ++--
 .../ambari/logsearch/solr/SolrConstants.java       |  11 +-
 .../MetadataRequestQueryConverterTest.java         |   7 +-
 16 files changed, 174 insertions(+), 283 deletions(-)

diff --git a/ambari-logsearch-config-solr/src/main/java/org/apache/ambari/logsearch/config/solr/LogLevelFilterManagerSolr.java b/ambari-logsearch-config-solr/src/main/java/org/apache/ambari/logsearch/config/solr/LogLevelFilterManagerSolr.java
index 90005fa..8ebd5d2 100644
--- a/ambari-logsearch-config-solr/src/main/java/org/apache/ambari/logsearch/config/solr/LogLevelFilterManagerSolr.java
+++ b/ambari-logsearch-config-solr/src/main/java/org/apache/ambari/logsearch/config/solr/LogLevelFilterManagerSolr.java
@@ -62,10 +62,10 @@ public class LogLevelFilterManagerSolr implements LogLevelFilterManager {
     if (useClusterParam) {
       doc.addField("cluster_string", clusterName);
     }
-    doc.addField("filtername", logId);
-    doc.addField("rowtype", "log_level_filter");
-    doc.addField("jsons", gson.toJson(filter));
-    doc.addField("username", "default");
+    doc.addField("name", logId);
+    doc.addField("type", "log_level_filter");
+    doc.addField("value", gson.toJson(filter));
+    doc.addField("username", "none");
     logger.debug("Creating log level filter - logid: {}, cluster: {}", logId, clusterName);
     solrClient.add(doc);
   }
@@ -112,16 +112,16 @@ public class LogLevelFilterManagerSolr implements LogLevelFilterManager {
       if (useClusterParam) {
         solrQuery.addFilterQuery("cluster_string:" + clusterName);
       }
-      solrQuery.addFilterQuery("rowtype:log_level_filter");
-      solrQuery.setFields("jsons", "filtername");
+      solrQuery.addFilterQuery("type:log_level_filter");
+      solrQuery.setFields("value", "name");
 
       final QueryResponse response = solrClient.query(solrQuery);
       if (response != null) {
         final SolrDocumentList documents = response.getResults();
         if (documents != null && !documents.isEmpty()) {
           for(SolrDocument document : documents) {
-            String jsons = (String) document.getFieldValue("jsons");
-            String logId = (String) document.getFieldValue("filtername");
+            String jsons = (String) document.getFieldValue("value");
+            String logId = (String) document.getFieldValue("name");
             if (jsons != null) {
               LogLevelFilter logLevelFilter = gson.fromJson(jsons, LogLevelFilter.class);
               logLevelFilterTreeMap.put(logId,logLevelFilter);
@@ -149,13 +149,11 @@ public class LogLevelFilterManagerSolr implements LogLevelFilterManager {
   }
 
   private void waitForSolr(SolrClient solrClient) {
-    boolean solrAvailable = false;
-    while (!solrAvailable) {
+    while (true) {
       try {
         logger.debug("Start solr ping for log level filter collection");
         SolrPingResponse pingResponse = solrClient.ping();
         if (pingResponse.getStatus() == 0) {
-          solrAvailable = true;
           break;
         }
       } catch (Exception e) {
diff --git a/ambari-logsearch-logfeeder/src/main/java/org/apache/ambari/logfeeder/common/LogFeederConstants.java b/ambari-logsearch-logfeeder/src/main/java/org/apache/ambari/logfeeder/common/LogFeederConstants.java
index 62c0533..b8e047d 100644
--- a/ambari-logsearch-logfeeder/src/main/java/org/apache/ambari/logfeeder/common/LogFeederConstants.java
+++ b/ambari-logsearch-logfeeder/src/main/java/org/apache/ambari/logfeeder/common/LogFeederConstants.java
@@ -31,10 +31,6 @@ public class LogFeederConstants {
   public static final String SOLR_COMPONENT = "type";
   public static final String SOLR_HOST = "host";
 
-  // Event History Constants History
-  public static final String VALUES = "jsons";
-  public static final String ROW_TYPE = "rowtype";
-
   public static final String IN_MEMORY_TIMESTAMP = "in_memory_timestamp";
 
   public static final String LOGFEEDER_PROPERTIES_FILE = "logfeeder.properties";
diff --git a/ambari-logsearch-server/src/main/configsets/logsearch_metadata/conf/managed-schema b/ambari-logsearch-server/src/main/configsets/logsearch_metadata/conf/managed-schema
index 76e3aea..bebd95f 100644
--- a/ambari-logsearch-server/src/main/configsets/logsearch_metadata/conf/managed-schema
+++ b/ambari-logsearch-server/src/main/configsets/logsearch_metadata/conf/managed-schema
@@ -80,12 +80,11 @@
   </fieldType>
 
   <field name="_version_" type="long" indexed="false" stored="true"/>
-  <field name="filtername" type="key_lower_case" indexed="true" required="true" stored="true"/>
   <field name="id" type="string" required="true"/>
-  <field name="jsons" type="string"/>
-  <field name="rowtype" type="string" required="true"/>
-  <field name="share_username_list" type="string" multiValued="true"/>
+  <field name="name" type="key_lower_case" indexed="true" required="true" stored="true"/>
   <field name="username" type="key_lower_case" indexed="true" required="true" stored="true"/>
+  <field name="type" type="string" required="true"/>
+  <field name="value" type="string"/>
   <field name="text" type="text_std_token_lower_case" multiValued="true" indexed="true" stored="false"/>
 
   <dynamicField name='ngram_*' type="n_gram" multiValued="false" stored="false"/>
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/LogSearchConstants.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/LogSearchConstants.java
index a0c5aa9..23bd528 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/LogSearchConstants.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/common/LogSearchConstants.java
@@ -133,8 +133,9 @@ public class LogSearchConstants {
   public static final String REQUEST_PARAM_SOURCE_LOG_ID = "sourceLogId";
   public static final String REQUEST_PARAM_KEYWORD_TYPE = "keywordType";
   public static final String REQUEST_PARAM_TOKEN = "token";
-  public static final String REQUEST_PARAM_FILTER_NAME = "filterName";
-  public static final String REQUEST_PARAM_ROW_TYPE = "rowType";
+  public static final String REQUEST_PARAM_METADATA_NAME = "name";
+  public static final String REQUEST_PARAM_METADATA_TYPE = "type";
+  public static final String REQUEST_PARAM_METADATA_USER_NAME = "userName";
   public static final String REQUEST_PARAM_UTC_OFFSET = "utcOffset";
   public static final String REQUEST_PARAM_HOSTS = "hostList";
   public static final String REQUEST_PARAM_USERS = "userList";
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverter.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverter.java
index 1010770..085e4cc 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverter.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverter.java
@@ -29,8 +29,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.ambari.logsearch.solr.SolrConstants.CommonLogConstants.CLUSTER;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.FILTER_NAME;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.ROW_TYPE;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.NAME;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.TYPE;
 
 @Named
 public class MetadataRequestQueryConverter extends AbstractConverterAware<MetadataRequest, SolrQuery> {
@@ -39,28 +39,18 @@ public class MetadataRequestQueryConverter extends AbstractConverterAware<Metada
   public SolrQuery convert(MetadataRequest metadataRequest) {
     SolrQuery metadataQuery = new SolrQuery();
     metadataQuery.setQuery("*:*");
+    metadataQuery.addFilterQuery(String.format("%s:%s", TYPE, metadataRequest.getType()));
+    if (StringUtils.isNotBlank(metadataRequest.getName())) {
+      metadataQuery.addFilterQuery(String.format("%s:%s", NAME, metadataRequest.getName()));
+    }
 
-    int startIndex = StringUtils.isNotEmpty(metadataRequest.getStartIndex()) && StringUtils.isNumeric(metadataRequest.getStartIndex())
-      ? Integer.parseInt(metadataRequest.getStartIndex()) : 0;
-    int maxRows = StringUtils.isNotEmpty(metadataRequest.getPageSize()) && StringUtils.isNumeric(metadataRequest.getPageSize())
-      ? Integer.parseInt(metadataRequest.getPageSize()) : 10;
-
-    SolrQuery.ORDER order = metadataRequest.getSortType() != null && SolrQuery.ORDER.desc.equals(SolrQuery.ORDER.valueOf(metadataRequest.getSortType()))
-      ? SolrQuery.ORDER.desc : SolrQuery.ORDER.asc;
-    String sortBy = StringUtils.isNotEmpty(metadataRequest.getSortBy()) ? metadataRequest.getSortBy() : FILTER_NAME;
-    String filterName = StringUtils.isBlank(metadataRequest.getFilterName()) ? "*" : "*" + metadataRequest.getFilterName() + "*";
-
-    metadataQuery.addFilterQuery(String.format("%s:%s", ROW_TYPE, metadataRequest.getRowType()));
-    metadataQuery.addFilterQuery(String.format("%s:%s", FILTER_NAME, SolrUtil.makeSearcableString(filterName)));
-    metadataQuery.setStart(startIndex);
-    metadataQuery.setRows(maxRows);
-
-    SolrQuery.SortClause sortOrder = SolrQuery.SortClause.create(sortBy, order);
+    SolrQuery.SortClause sortOrder = SolrQuery.SortClause.create(NAME, SolrQuery.ORDER.asc);
     List<SolrQuery.SortClause> sort = new ArrayList<>();
     sort.add(sortOrder);
+    metadataQuery.setRows(10000);
     metadataQuery.setSorts(sort);
 
-    SolrUtil.addListFilterToSolrQuery(metadataQuery, CLUSTER, metadataRequest.getClusters());
+    SolrUtil.addListFilterToSolrQuery(metadataQuery, CLUSTER + "_string", metadataRequest.getClusters());
 
     return metadataQuery;
   }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/dao/MetadataSolrDao.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/dao/MetadataSolrDao.java
index 68218c1..61f18b3 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/dao/MetadataSolrDao.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/dao/MetadataSolrDao.java
@@ -89,8 +89,8 @@ public class MetadataSolrDao extends SolrDaoBase {
     }
   }
 
-  public UpdateResponse deleteEventHistoryData(String id) {
-    return removeDoc("id:" + id);
+  public UpdateResponse deleteMetadata(String name, String type) {
+    return removeDoc(String.format("name:%s AND type:%s", name, type));
   }
 
   private UpdateResponse removeDoc(String query) {
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/doc/DocConstants.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/doc/DocConstants.java
index c2c6013..21eb18f 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/doc/DocConstants.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/doc/DocConstants.java
@@ -113,16 +113,16 @@ public class DocConstants {
     public static final String GET_ALL_SHIPPER_CONFIG_INFO_OD = "List all available shipper configuration element";
   }
 
-  public class EventHistoryDescriptions {
-    public static final String FILTER_NAME_D = "The saved query as filter in Solr, search is sopprted by this param";
-    public static final String ROW_TYPE_D = "Row type is solr to identify as filter query";
+  public class MetadataDescriptions {
+    public static final String NAME_D = "Name identifier of the metadata";
+    public static final String TYPE_D = "Type of the metadata";
+    public static final String USER_NAME_D = "User name of the metadata";
   }
 
-  public class EventHistoryOperationDescriptions {
+  public class MetadataOperationDescriptions {
     public static final String SAVE_METADATA_OD = "Save metadata";
     public static final String DELETE_METADATA_OD = "Delete metadata";
-    public static final String GET_METADATA_OD = "Get event metadata";
-    public static final String GET_ALL_USER_NAMES_OD = "Get all user names";
+    public static final String GET_METADATA_OD = "Get metadata";
   }
 
   public class ShipperConfigOperationDescriptions {
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/MetadataManager.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/MetadataManager.java
index d98842e..95d2fd7 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/MetadataManager.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/manager/MetadataManager.java
@@ -21,36 +21,29 @@ package org.apache.ambari.logsearch.manager;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
+import java.util.UUID;
 
 import org.apache.ambari.logsearch.common.LogSearchContext;
 import org.apache.ambari.logsearch.dao.MetadataSolrDao;
 import org.apache.ambari.logsearch.model.request.impl.MetadataRequest;
 import org.apache.ambari.logsearch.model.response.LogsearchMetaData;
-import org.apache.ambari.logsearch.model.response.LogSearchMetaDataListResponse;
-import org.apache.ambari.logsearch.util.SolrUtil;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.solr.client.solrj.SolrQuery;
-import org.apache.solr.client.solrj.response.FacetField.Count;
-import org.apache.solr.client.solrj.response.QueryResponse;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
-import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.springframework.core.convert.ConversionService;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.ID;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.USER_NAME;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.VALUES;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.FILTER_NAME;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.ROW_TYPE;
-import static org.apache.ambari.logsearch.solr.SolrConstants.EventHistoryConstants.SHARE_NAME_LIST;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.ID;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.USER_NAME;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.VALUE;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.NAME;
+import static org.apache.ambari.logsearch.solr.SolrConstants.MetadataConstants.TYPE;
 
 @Named
 public class MetadataManager extends JsonManagerBase {
@@ -63,120 +56,73 @@ public class MetadataManager extends JsonManagerBase {
   private ConversionService conversionService;
 
   public String saveMetadata(LogsearchMetaData metadata) {
-    String filterName = metadata.getFiltername();
+    String name = metadata.getName();
 
     SolrInputDocument solrInputDoc = new SolrInputDocument();
-    if (!isValid(metadata)) {
-      throw new MalformedInputException("No FilterName Specified");
-    }
-
-    if (isNotUnique(filterName)) {
-      throw new AlreadyExistsException(String.format("Name '%s' already exists", metadata.getFiltername()));
-    }
-    solrInputDoc.addField(ID, metadata.getId());
-    solrInputDoc.addField(USER_NAME, LogSearchContext.getCurrentUsername());
-    solrInputDoc.addField(VALUES, metadata.getValues());
-    solrInputDoc.addField(FILTER_NAME, filterName);
-    solrInputDoc.addField(ROW_TYPE, metadata.getRowType());
-    List<String> shareNameList = metadata.getShareNameList();
-    if (CollectionUtils.isNotEmpty(shareNameList)) {
-      solrInputDoc.addField(SHARE_NAME_LIST, shareNameList);
+    if (!isValid(metadata, false)) {
+      throw new MalformedInputException("Name,type and value should be specified");
     }
+    final String userName = LogSearchContext.getCurrentUsername().toLowerCase();
+    solrInputDoc.addField(ID, generateUniqueId(metadata, userName));
+    solrInputDoc.addField(USER_NAME, userName);
+    solrInputDoc.addField(VALUE, metadata.getValue());
+    solrInputDoc.addField(NAME, name);
+    solrInputDoc.addField(TYPE, metadata.getType());
 
     metadataSolrDao.addDocs(solrInputDoc);
     return convertObjToString(solrInputDoc);
   }
 
-  private boolean isNotUnique(String filterName) {
-
-    if (filterName != null) {
-      SolrQuery solrQuery = new SolrQuery();
-      filterName = SolrUtil.makeSearcableString(filterName);
-      solrQuery.setQuery("*:*");
-      solrQuery.addFilterQuery(FILTER_NAME + ":" + filterName);
-      solrQuery.addFilterQuery(USER_NAME + ":" + LogSearchContext.getCurrentUsername());
-      SolrUtil.setRowCount(solrQuery, 0);
-      try {
-        Long numFound = metadataSolrDao.process(solrQuery).getResults().getNumFound();
-        if (numFound > 0) {
-          return true;
-        }
-      } catch (SolrException e) {
-        logger.error("Error while checking if metadata is unique.", e);
-      }
+  public void deleteMetadata(LogsearchMetaData metaData) {
+    if (!isValid(metaData, true)) {
+      throw new MalformedInputException("Name and type should be specified");
     }
-    return false;
-  }
-
-  private boolean isValid(LogsearchMetaData mData) {
-    return StringUtils.isNotBlank(mData.getFiltername())
-        && StringUtils.isNotBlank(mData.getRowType())
-        && StringUtils.isNotBlank(mData.getValues());
-  }
-
-  public void deleteMetadata(String id) {
-    metadataSolrDao.deleteEventHistoryData(id);
+    metadataSolrDao.deleteMetadata(metaData.getName(), metaData.getType());
   }
 
   @SuppressWarnings("unchecked")
-  public LogSearchMetaDataListResponse getMetadata(MetadataRequest request) {
-    LogSearchMetaDataListResponse response = new LogSearchMetaDataListResponse();
-    String rowType = request.getRowType();
-    if (StringUtils.isBlank(rowType)) {
-      throw new MalformedInputException("Row type was not specified");
-    }
-
+  public Collection<LogsearchMetaData> getMetadata(MetadataRequest request) {
     SolrQuery metadataQueryQuery = conversionService.convert(request, SolrQuery.class);
-    metadataQueryQuery.addFilterQuery(String.format("%s:%s OR %s:%s", USER_NAME, LogSearchContext.getCurrentUsername(),
-        SHARE_NAME_LIST, LogSearchContext.getCurrentUsername()));
+
+    final String userName;
+    if (StringUtils.isNotBlank(request.getUserName())) {
+      userName = request.getUserName();
+    } else {
+      userName = LogSearchContext.getCurrentUsername();
+    }
+    if (StringUtils.isBlank(userName)) {
+      throw new IllegalArgumentException("User name is not found for metadata request.");
+    }
+    metadataQueryQuery.addFilterQuery(String.format("%s:%s", USER_NAME, userName.toLowerCase()));
     SolrDocumentList solrList = metadataSolrDao.process(metadataQueryQuery).getResults();
 
-    Collection<LogsearchMetaData> configList = new ArrayList<>();
+    Collection<LogsearchMetaData> metadataList = new ArrayList<>();
 
     for (SolrDocument solrDoc : solrList) {
       LogsearchMetaData metadata = new LogsearchMetaData();
-      metadata.setFiltername("" + solrDoc.get(FILTER_NAME));
-      metadata.setId("" + solrDoc.get(ID));
-      metadata.setValues("" + solrDoc.get(VALUES));
-      metadata.setRowType("" + solrDoc.get(ROW_TYPE));
-      try {
-        List<String> shareNameList = (List<String>) solrDoc.get(SHARE_NAME_LIST);
-        metadata.setShareNameList(shareNameList);
-      } catch (Exception e) {
-        // do nothing
-      }
-
-      metadata.setUserName("" + solrDoc.get(USER_NAME));
-
-      configList.add(metadata);
-    }
-
-    response.setName("metadataList");
-    response.setMetadataList(configList);
+      metadata.setName(solrDoc.get(NAME).toString());
+      metadata.setId(solrDoc.get(ID).toString());
+      metadata.setValue(solrDoc.getOrDefault(VALUE, "").toString());
+      metadata.setType(solrDoc.get(TYPE).toString());
+      metadata.setUserName(solrDoc.get(USER_NAME).toString());
 
-    response.setStartIndex(Integer.parseInt(request.getStartIndex()));
-    response.setPageSize(Integer.parseInt(request.getPageSize()));
+      metadataList.add(metadata);
+    }
 
-    response.setTotalCount(solrList.getNumFound());
+    return metadataList;
 
-    return response;
+  }
 
+  private String generateUniqueId(LogsearchMetaData metaData, String userName) {
+    String strToUUID = metaData.getName() +
+      metaData.getType() +
+      userName;
+    return UUID.nameUUIDFromBytes(strToUUID.getBytes()).toString();
   }
 
-  public List<String> getAllUserName() {
-    List<String> userList = new ArrayList<>();
-    SolrQuery userListQuery = new SolrQuery();
-    userListQuery.setQuery("*:*");
-    SolrUtil.setFacetField(userListQuery, USER_NAME);
-    QueryResponse queryResponse = metadataSolrDao.process(userListQuery);
-    if (queryResponse == null) {
-      return userList;
-    }
-    List<Count> counList = queryResponse.getFacetField(USER_NAME).getValues();
-    for (Count cnt : counList) {
-      String userName = cnt.getName();
-      userList.add(userName);
-    }
-    return userList;
+  private boolean isValid(LogsearchMetaData mData, boolean skipValueCheck) {
+    return StringUtils.isNotBlank(mData.getName())
+      && StringUtils.isNotBlank(mData.getType())
+      && (skipValueCheck || StringUtils.isNotBlank(mData.getValue()));
   }
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/MetadataParamDefinition.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/MetadataParamDefinition.java
index 39375df..8a579b8 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/MetadataParamDefinition.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/MetadataParamDefinition.java
@@ -21,18 +21,24 @@ package org.apache.ambari.logsearch.model.request;
 import io.swagger.annotations.ApiParam;
 import org.apache.ambari.logsearch.common.LogSearchConstants;
 
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryDescriptions.FILTER_NAME_D;
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryDescriptions.ROW_TYPE_D;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataDescriptions.NAME_D;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataDescriptions.TYPE_D;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataDescriptions.USER_NAME_D;
 
 public interface MetadataParamDefinition {
 
-  String getFilterName();
+  String getName();
 
-  @ApiParam(value = FILTER_NAME_D, name = LogSearchConstants.REQUEST_PARAM_FILTER_NAME)
-  void setFilterName(String filterName);
+  @ApiParam(value = NAME_D, name = LogSearchConstants.REQUEST_PARAM_METADATA_NAME)
+  void setName(String name);
 
-  String getRowType();
+  String getType();
 
-  @ApiParam(value = ROW_TYPE_D, name = LogSearchConstants.REQUEST_PARAM_ROW_TYPE)
-  void setRowType(String rowType);
+  @ApiParam(value = TYPE_D, name = LogSearchConstants.REQUEST_PARAM_METADATA_TYPE)
+  void setType(String type);
+
+  String getUserName();
+
+  @ApiParam(value = USER_NAME_D, name = LogSearchConstants.REQUEST_PARAM_METADATA_USER_NAME)
+  void setUserName(String userName);
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/MetadataRequest.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/MetadataRequest.java
index 3a2c1e6..d3acb4e 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/MetadataRequest.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/MetadataRequest.java
@@ -19,8 +19,9 @@
 package org.apache.ambari.logsearch.model.request.impl;
 
 import org.apache.ambari.logsearch.common.Marker;
+import org.apache.ambari.logsearch.model.request.ClustersParamDefinition;
 import org.apache.ambari.logsearch.model.request.MetadataParamDefinition;
 
 @Marker
-public interface MetadataRequest extends CommonSearchRequest, MetadataParamDefinition {
+public interface MetadataRequest extends MetadataParamDefinition, ClustersParamDefinition {
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/query/MetadataQueryRequest.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/query/MetadataQueryRequest.java
index ec55d9c..391f5a2 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/query/MetadataQueryRequest.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/request/impl/query/MetadataQueryRequest.java
@@ -21,33 +21,64 @@ package org.apache.ambari.logsearch.model.request.impl.query;
 import org.apache.ambari.logsearch.common.LogSearchConstants;
 import org.apache.ambari.logsearch.model.request.impl.MetadataRequest;
 
+import javax.annotation.Nullable;
+import javax.validation.constraints.NotNull;
 import javax.ws.rs.QueryParam;
 
-public class MetadataQueryRequest extends CommonSearchQueryRequest implements MetadataRequest {
+public class MetadataQueryRequest implements MetadataRequest {
 
-  @QueryParam(LogSearchConstants.REQUEST_PARAM_FILTER_NAME)
-  private String filterName;
+  @QueryParam(LogSearchConstants.REQUEST_PARAM_METADATA_NAME)
+  private String name;
 
-  @QueryParam(LogSearchConstants.REQUEST_PARAM_ROW_TYPE)
-  private String rowType;
+  @QueryParam(LogSearchConstants.REQUEST_PARAM_METADATA_TYPE)
+  @NotNull
+  private String type;
+
+  @QueryParam(LogSearchConstants.REQUEST_PARAM_METADATA_USER_NAME)
+  private String userName;
+
+  @Nullable
+  @QueryParam(LogSearchConstants.REQUEST_PARAM_CLUSTER_NAMES)
+  private String clusters;
+
+  @Override
+  public String getName() {
+    return name;
+  }
+
+  @Override
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  @Override
+  public String getType() {
+    return type;
+  }
+
+  @Override
+  public void setType(String type) {
+    this.type = type;
+  }
 
   @Override
-  public String getFilterName() {
-    return filterName;
+  public String getUserName() {
+    return userName;
   }
 
   @Override
-  public void setFilterName(String filterName) {
-    this.filterName = filterName;
+  public void setUserName(String userName) {
+    this.userName = userName;
   }
 
   @Override
-  public String getRowType() {
-    return rowType;
+  @Nullable
+  public String getClusters() {
+    return clusters;
   }
 
   @Override
-  public void setRowType(String rowType) {
-    this.rowType = rowType;
+  public void setClusters(@Nullable String clusters) {
+    this.clusters = clusters;
   }
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogSearchMetaDataListResponse.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogSearchMetaDataListResponse.java
deleted file mode 100644
index 04523c2..0000000
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogSearchMetaDataListResponse.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.ambari.logsearch.model.response;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.util.Collection;
-
-@ApiModel
-public class LogSearchMetaDataListResponse extends SearchResponse{
-
-  @ApiModelProperty
-  private String name;
-
-  @ApiModelProperty
-  private Collection<LogsearchMetaData> metadataList;
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Collection<LogsearchMetaData> getMetadataList() {
-    return metadataList;
-  }
-
-  public void setMetadataList(Collection<LogsearchMetaData> metadataList) {
-    this.metadataList = metadataList;
-  }
-
-  @Override
-  public int getListSize() {
-    return metadataList != null ? metadataList.size() : 0;
-  }
-}
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogsearchMetaData.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogsearchMetaData.java
index be5164b..2a0763f 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogsearchMetaData.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/model/response/LogsearchMetaData.java
@@ -21,7 +21,6 @@ package org.apache.ambari.logsearch.model.response;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
-import java.util.List;
 
 public class LogsearchMetaData {
 
@@ -32,16 +31,13 @@ public class LogsearchMetaData {
   private String userName;
 
   @ApiModelProperty
-  private String filtername;
+  private String name;
 
   @ApiModelProperty
-  private String values;
+  private String value;
 
   @ApiModelProperty
-  private List<String> shareNameList;
-
-  @ApiModelProperty
-  private String rowType;
+  private String type;
 
   public LogsearchMetaData() {
     id = String.valueOf(new Date().getTime());
@@ -63,35 +59,27 @@ public class LogsearchMetaData {
     this.userName = userName;
   }
 
-  public String getFiltername() {
-    return filtername;
-  }
-
-  public void setFiltername(String filtername) {
-    this.filtername = filtername;
-  }
-
-  public List<String> getShareNameList() {
-    return shareNameList;
+  public String getName() {
+    return name;
   }
 
-  public void setShareNameList(List<String> shareNameList) {
-    this.shareNameList = shareNameList;
+  public void setName(String name) {
+    this.name = name;
   }
 
-  public String getValues() {
-    return values;
+  public String getValue() {
+    return value;
   }
 
-  public void setValues(String values) {
-    this.values = values;
+  public void setValue(String value) {
+    this.value = value;
   }
 
-  public String getRowType() {
-    return rowType;
+  public String getType() {
+    return type;
   }
 
-  public void setRowType(String rowType) {
-    this.rowType = rowType;
+  public void setType(String type) {
+    this.type = type;
   }
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/MetadataResource.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/MetadataResource.java
index e6ce11f..c0f256c 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/MetadataResource.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/rest/MetadataResource.java
@@ -19,15 +19,15 @@
 
 package org.apache.ambari.logsearch.rest;
 
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryOperationDescriptions.DELETE_METADATA_OD;
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryOperationDescriptions.GET_ALL_USER_NAMES_OD;
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryOperationDescriptions.GET_METADATA_OD;
-import static org.apache.ambari.logsearch.doc.DocConstants.EventHistoryOperationDescriptions.SAVE_METADATA_OD;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataOperationDescriptions.DELETE_METADATA_OD;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataOperationDescriptions.GET_METADATA_OD;
+import static org.apache.ambari.logsearch.doc.DocConstants.MetadataOperationDescriptions.SAVE_METADATA_OD;
 
-import java.util.List;
+import java.util.Collection;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.validation.Valid;
 import javax.ws.rs.BeanParam;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
@@ -39,7 +39,6 @@ import javax.ws.rs.Produces;
 import org.apache.ambari.logsearch.manager.MetadataManager;
 import org.apache.ambari.logsearch.model.request.impl.query.MetadataQueryRequest;
 import org.apache.ambari.logsearch.model.response.LogsearchMetaData;
-import org.apache.ambari.logsearch.model.response.LogSearchMetaDataListResponse;
 import org.springframework.context.annotation.Scope;
 
 import io.swagger.annotations.Api;
@@ -63,25 +62,16 @@ public class MetadataResource {
   }
 
   @DELETE
-  @Path("/{id}")
   @ApiOperation(DELETE_METADATA_OD)
-  public void deleteMetadata(@PathParam("id") String id) {
-    metadataManager.deleteMetadata(id);
+  public void deleteMetadata(LogsearchMetaData metadata) {
+    metadataManager.deleteMetadata(metadata);
   }
 
   @GET
   @Produces({"application/json"})
   @ApiOperation(GET_METADATA_OD)
-  public LogSearchMetaDataListResponse getMetadataList(@BeanParam MetadataQueryRequest request) {
+  public Collection<LogsearchMetaData> getMetadataList(@Valid @BeanParam MetadataQueryRequest request) {
     return metadataManager.getMetadata(request);
   }
 
-  @GET
-  @Path("/names")
-  @Produces({"application/json"})
-  @ApiOperation(GET_ALL_USER_NAMES_OD)
-  public List<String> getAllUserName() {
-    return metadataManager.getAllUserName();
-  }
-
 }
diff --git a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/solr/SolrConstants.java b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/solr/SolrConstants.java
index a999f93..899ad11 100644
--- a/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/solr/SolrConstants.java
+++ b/ambari-logsearch-server/src/main/java/org/apache/ambari/logsearch/solr/SolrConstants.java
@@ -105,15 +105,14 @@ public class SolrConstants {
     public static final String AUDIT_TAGS_STR = "tags_str";
   }
 
-  public class EventHistoryConstants {
-    private EventHistoryConstants() {
+  public class MetadataConstants {
+    private MetadataConstants() {
     }
 
     public static final String ID = "id";
     public static final String USER_NAME = "username";
-    public static final String VALUES = "jsons";
-    public static final String FILTER_NAME = "filtername";
-    public static final String ROW_TYPE = "rowtype";
-    public static final String SHARE_NAME_LIST = "share_username_list";
+    public static final String VALUE = "value";
+    public static final String NAME = "name";
+    public static final String TYPE = "type";
   }
 }
diff --git a/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverterTest.java b/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverterTest.java
index b30fdd4..e29bcc7 100644
--- a/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverterTest.java
+++ b/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/converter/MetadataRequestQueryConverterTest.java
@@ -39,13 +39,14 @@ public class MetadataRequestQueryConverterTest extends AbstractRequestConverterT
   public void testConvert() {
     // GIVEN
     MetadataRequest request = new MetadataQueryRequest();
-    request.setRowType("myRowType"); // TODO: validate these 3 fields @Valid on EventHistoryRequest object -> not null
-    request.setFilterName("myFilterName");
+    request.setType("myRowType");
+    request.setName("myFilterName");
+    request.setUserName("myUserName");
     request.setClusters("cl1,cl2");
     // WHEN
     SolrQuery queryResult = underTest.convert(request);
     // THEN
-    assertEquals("?q=*%3A*&fq=rowtype%3AmyRowType&fq=filtername%3A*myFilterName*&fq=cluster%3A%28cl1+OR+cl2%29&start=0&rows=10&sort=filtername+asc",
+    assertEquals("?q=*%3A*&fq=type%3AmyRowType&fq=name%3AmyFilterName&fq=cluster_string%3A%28cl1+OR+cl2%29&rows=10000&sort=name+asc",
       queryResult.toQueryString());
   }
 }