diff --git a/catalog/tests/unit-tests/publish/test-publish-adapter.cpp b/catalog/tests/unit-tests/publish/test-publish-adapter.cpp
index 90c6f3f..bc47970 100644
--- a/catalog/tests/unit-tests/publish/test-publish-adapter.cpp
+++ b/catalog/tests/unit-tests/publish/test-publish-adapter.cpp
@@ -45,7 +45,14 @@
     {
     }
 
-    void setTableFields(const std::vector<std::string>& tableFields)
+    void
+    setDatabaseTable(const std::string& databaseTable)
+    {
+      m_databaseTable = databaseTable;
+    }
+
+    void
+    setTableFields(const std::vector<std::string>& tableFields)
     {
       m_tableColumns = tableFields;
     }
@@ -103,6 +110,7 @@
     PublishAdapterFixture()
       : face(makeDummyClientFace(io))
       , keyChain(new ndn::KeyChain())
+      , databaseTable("cmip5")
       , publishAdapterTest1(face, keyChain)
       , publishAdapterTest2(face, keyChain)
     {
@@ -121,6 +129,10 @@
       tableFields.push_back(c8);
       tableFields.push_back(c9);
       tableFields.push_back(c10);
+      publishAdapterTest1.setDatabaseTable(databaseTable);
+      publishAdapterTest1.setTableFields(tableFields);
+      publishAdapterTest2.setDatabaseTable(databaseTable);
+      publishAdapterTest2.setTableFields(tableFields);
     }
 
     virtual
@@ -151,7 +163,7 @@
       catch (boost::property_tree::info_parser_error &e) {
         std::cout << "Failed to read config file " << e.what() << std::endl;
       }
-      publishAdapterTest1.setTableFields(tableFields);
+
       publishAdapterTest1.configAdapter(section, ndn::Name("/test"));
     }
 
@@ -178,16 +190,17 @@
       catch (boost::property_tree::info_parser_error &e) {
         std::cout << "Failed to read config file " << e.what() << std::endl;;
       }
-      publishAdapterTest2.setTableFields(tableFields);
+
       publishAdapterTest2.configAdapter(section, ndn::Name("/test"));
     }
 
   protected:
     std::shared_ptr<DummyClientFace> face;
     std::shared_ptr<ndn::KeyChain> keyChain;
+    std::vector<std::string> tableFields;
+    std::string databaseTable;
     PublishAdapterTest publishAdapterTest1;
     PublishAdapterTest publishAdapterTest2;
-    std::vector<std::string> tableFields;
   };
 
   BOOST_FIXTURE_TEST_SUITE(PublishAdapterTestSuite, PublishAdapterFixture)
diff --git a/catalog/tests/unit-tests/query/test-query-adapter.cpp b/catalog/tests/unit-tests/query/test-query-adapter.cpp
index fdf5140..568f5ad 100644
--- a/catalog/tests/unit-tests/query/test-query-adapter.cpp
+++ b/catalog/tests/unit-tests/query/test-query-adapter.cpp
@@ -45,6 +45,11 @@
     {
     }
 
+    void setDatabaseTable(const std::string& databaseTable)
+    {
+      m_databaseTable.assign(databaseTable);
+    }
+
     void setNameFields(const std::vector<std::string>& nameFields)
     {
       m_nameFields = nameFields;
@@ -91,10 +96,12 @@
                  uint64_t segmentNo,
                  bool isFinalBlock,
                  bool isAutocomplete,
-                 uint64_t resultCount)
+                 uint64_t resultCount,
+                 uint64_t viewStart,
+                 uint64_t viewEnd)
     {
       return makeReplyData(segmentPrefix, value, segmentNo, isFinalBlock,
-                           isAutocomplete, resultCount);
+                           isAutocomplete, resultCount, viewStart, viewEnd);
     }
 
     void
@@ -115,7 +122,7 @@
       fileList.append("/ndn/test3");
 
       std::shared_ptr<ndn::Data> data = makeReplyData(segmentPrefix,
-                                                      fileList, 0, true, false, 3);
+                                                      fileList, 0, true, false, 3, 0, 2);
       m_mutex.lock();
       m_cache.insert(*data);
       m_mutex.unlock();
@@ -155,6 +162,13 @@
     {
       return json2AutocompletionSql(sqlQuery, jsonValue);
     }
+
+    bool
+    json2CompleteSearchSqlTest(std::stringstream& sqlQuery,
+                               Json::Value& jsonValue)
+    {
+      return json2CompleteSearchSql(sqlQuery, jsonValue);
+    }
   };
 
   class QueryAdapterFixture : public UnitTestTimeFixture
@@ -163,6 +177,7 @@
     QueryAdapterFixture()
       : face(makeDummyClientFace(io))
       , keyChain(new ndn::KeyChain())
+      , databaseTable("cmip5")
       , queryAdapterTest1(face, keyChain)
       , queryAdapterTest2(face, keyChain)
     {
@@ -179,6 +194,11 @@
       nameFields.push_back(c8);
       nameFields.push_back(c9);
       nameFields.push_back(c10);
+
+      queryAdapterTest1.setDatabaseTable(databaseTable);
+      queryAdapterTest1.setNameFields(nameFields);
+      queryAdapterTest2.setDatabaseTable(databaseTable);
+      queryAdapterTest2.setNameFields(nameFields);
     }
 
     virtual
@@ -194,6 +214,7 @@
       try {
         std::stringstream ss;
         ss << "signingId /test/signingId\
+             filterCategoryNames activity,product,organization,model,experiment,frequency,modeling_realm,variable_name,ensemble\
              database                   \
              {                          \
               dbServer localhost        \
@@ -206,7 +227,7 @@
       catch (boost::property_tree::info_parser_error &e) {
         std::cout << "Failed to read config file " << e.what() << std::endl;;
       }
-      queryAdapterTest1.setNameFields(nameFields);
+
       queryAdapterTest1.configAdapter(section, ndn::Name("/test"));
     }
 
@@ -216,7 +237,9 @@
       util::ConfigSection section;
       try {
         std::stringstream ss;
-        ss << "database\
+        ss << "\
+             filterCategoryNames activity,product,organization,model,experiment,frequency,modeling_realm,variable_name,ensemble\
+             database\
              {                                  \
               dbServer localhost                \
               dbName testdb                     \
@@ -228,16 +251,17 @@
       catch (boost::property_tree::info_parser_error &e) {
         std::cout << "Failed to read config file " << e.what() << std::endl;;
       }
-      queryAdapterTest2.setNameFields(nameFields);
+
       queryAdapterTest2.configAdapter(section, ndn::Name("/test"));
     }
 
   protected:
     std::shared_ptr<DummyClientFace> face;
     std::shared_ptr<ndn::KeyChain> keyChain;
+    std::string databaseTable;
+    std::vector<std::string> nameFields;
     QueryAdapterTest queryAdapterTest1;
     QueryAdapterTest queryAdapterTest2;
-    std::vector<std::string> nameFields;
   };
 
   BOOST_FIXTURE_TEST_SUITE(QueryAdapterTestSuite, QueryAdapterFixture)
@@ -381,8 +405,10 @@
       = ndn::name::Component::fromVersion(1);
 
     std::shared_ptr<ndn::Data> data = queryAdapterTest2.getAckData(interestPtr, version);
-    BOOST_CHECK_EQUAL(data->getName().toUri(), "/test/ack/data/json/%FD%01/catalogIdPlaceHolder/OK");
-    BOOST_CHECK_EQUAL(data->getContent().value_size(), 0);
+    BOOST_CHECK_EQUAL(data->getName().toUri(), "/test/ack/data/json");
+    BOOST_CHECK_EQUAL(std::string(reinterpret_cast<const char*>(data->getContent().value()),
+                                  data->getContent().value_size()),
+                      "/query-results/catalogIdPlaceHolder/json/%FD%01");
   }
 
   BOOST_AUTO_TEST_CASE(QueryAdapterMakeReplyDataTest1)
@@ -394,7 +420,7 @@
     const ndn::Name prefix("/atmos/test/prefix");
 
     std::shared_ptr<ndn::Data> data = queryAdapterTest2.getReplyData(prefix, fileList,
-                                                                     1, false, false, 2);
+                                                                     1, false, false, 2, 0, 1);
     BOOST_CHECK_EQUAL(data->getName().toUri(), "/atmos/test/prefix/%00%01");
     BOOST_CHECK_EQUAL(data->getFinalBlockId(), ndn::Name::Component(""));
     const std::string jsonRes(reinterpret_cast<const char*>(data->getContent().value()),
@@ -414,8 +440,8 @@
     fileList.append("/ndn/test1");
     const ndn::Name prefix("/atmos/test/prefix");
 
-    std::shared_ptr<ndn::Data> data = queryAdapterTest2.getReplyData(prefix,
-                                                                     fileList, 2, true, true, 1);
+    std::shared_ptr<ndn::Data> data = queryAdapterTest2.getReplyData(prefix, fileList,
+                                                                     2, true, true, 1, 0, 0);
 
     BOOST_CHECK_EQUAL(data->getName().toUri(), "/atmos/test/prefix/%00%02");
     BOOST_CHECK_EQUAL(data->getFinalBlockId(), ndn::Name::Component::fromSegment(2));
@@ -441,16 +467,18 @@
       = std::make_shared<ndn::Interest>(ndn::Name("/test/query").append(jsonMessage.c_str()));
 
     queryAdapterTest2.queryTest(queryInterest);
-    auto ackData = queryAdapterTest2.getDataFromActiveQuery(jsonMessage);
-
-    BOOST_CHECK(ackData);
-    if (ackData) {
-      BOOST_CHECK_EQUAL(ackData->getName().getPrefix(3),
-      ndn::Name("/test/query/%7B%22name%22%3A%22test%22%7D"));
-      BOOST_CHECK_EQUAL(ackData->getName().at(ackData->getName().size() - 1),
-                        ndn::Name::Component("OK"));
-      BOOST_CHECK_EQUAL(ackData->getContent().value_size(), 0);
-    }
+    // TODO: the code below should be enabled when queryAdapter can get the correct the
+    // ChronoSync state; currently, we don't need the activeQuery to save the ACK data;
+    //auto ackData = queryAdapterTest2.getDataFromActiveQuery(jsonMessage);
+    //
+    //BOOST_CHECK(ackData);
+    //if (ackData) {
+    //  BOOST_CHECK_EQUAL(ackData->getName().getPrefix(3),
+    //  ndn::Name("/test/query/%7B%22name%22%3A%22test%22%7D"));
+    //  BOOST_CHECK_EQUAL(ackData->getName().at(ackData->getName().size() - 1),
+    //                    ndn::Name::Component("OK"));
+    //  BOOST_CHECK_EQUAL(ackData->getContent().value_size(), 0);
+    //}
 
     std::shared_ptr<ndn::Interest> resultInterest
       = std::make_shared<ndn::Interest>(ndn::Name("/test/query-results"));
@@ -545,6 +573,62 @@
     BOOST_CHECK_EQUAL(false, queryAdapterTest2.json2AutocompletionSqlTest(ss, testJson4));
 }
 
+  BOOST_AUTO_TEST_CASE(QueryAdapterCompleteSearchSuccessTest)
+  {
+    initializeQueryAdapterTest2();
+
+    std::stringstream ss;
+    Json::Value testJson;
+    testJson["??"] = "/";
+    BOOST_CHECK_EQUAL(true, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson));
+    BOOST_CHECK_EQUAL("SELECT name FROM cmip5;", ss.str());
+
+    ss.str("");
+    ss.clear();
+    testJson.clear();
+    testJson["??"] = "/Activity/Product/Organization/Model/Experiment/Frequency/Modeling/\
+Variable/Ensemble/";
+    BOOST_CHECK_EQUAL(true, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson));
+    BOOST_CHECK_EQUAL("SELECT name FROM cmip5 WHERE activity='Activity' AND ensemble=\
+'Ensemble' AND experiment='Experiment' AND frequency='Frequency' AND model='Model' AND \
+modeling_realm='Modeling' AND organization='Organization' AND product='Product' AND variable_name=\
+'Variable';",ss.str());
+  }
+
+  BOOST_AUTO_TEST_CASE(QueryAdapterCompleteSearchFailureTest)
+  {
+    initializeQueryAdapterTest2();
+
+    std::stringstream ss;
+    Json::Value testJson;
+
+    ss.str("");
+    ss.clear();
+    testJson.clear();
+    testJson["??"] = "";
+    BOOST_CHECK_EQUAL(false, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson));
+
+    ss.str("");
+    ss.clear();
+    Json::Value testJson2; //simply clear does not work
+    testJson2[0] = "test"; // incorrect json object
+    BOOST_CHECK_EQUAL(false, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson2));
+
+    ss.str("");
+    ss.clear();
+    Json::Value testJson3;
+    testJson3 = Json::Value(Json::arrayValue);  // incorrect json object
+    BOOST_CHECK_EQUAL(false, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson3));
+
+    ss.str("");
+    ss.clear();
+    Json::Value testJson4;
+    Json::Value param;
+    param[0] = "test";
+    testJson4["name"] = param;  // incorrect json object
+    BOOST_CHECK_EQUAL(false, queryAdapterTest2.json2CompleteSearchSqlTest(ss, testJson4));
+  }
+
   BOOST_AUTO_TEST_SUITE_END()
 
 }//tests
