LENS-1389: Back Merge with master
diff --git a/contrib/clients/python/lens/client/main.py b/contrib/clients/python/lens/client/main.py
index bf5d81e..b1846ad 100644
--- a/contrib/clients/python/lens/client/main.py
+++ b/contrib/clients/python/lens/client/main.py
@@ -21,10 +21,12 @@
 from .session import LensSessionClient
 from .query import LensQueryClient
 from .utils import xml_file_to_conf
-
+import logging
+logger = logging.getLogger(__name__)
 
 class LensClient(object):
-    def __init__(self, base_url=None, username="", password="", database=None, conf=None):
+    def __init__(self, base_url=None, username="", password="", database=None, conf=None, logging_level=logging.INFO):
+        logging.basicConfig(level=logging_level)
         if conf and isinstance(conf, string_types) and os.path.exists(conf):
             if os.path.isdir(conf):
                 conf = os.path.join(conf, 'lens-client-site.xml')
@@ -35,6 +37,7 @@
         self.base_url = base_url or conf.get('lens.server.base.url', "http://0.0.0.0:9999/lensapi")
         if self.base_url[-1] != '/':
             self.base_url += "/"
+        logger.debug("Using conf %s", conf)
         username = username or conf.get('lens.client.user.name', "anonymous")
         database = database or conf.get('lens.client.dbname')
         self.session = LensSessionClient(self.base_url, username, password, database, conf)
diff --git a/contrib/clients/python/lens/client/query.py b/contrib/clients/python/lens/client/query.py
index f82f0cb..df16cca 100644
--- a/contrib/clients/python/lens/client/query.py
+++ b/contrib/clients/python/lens/client/query.py
@@ -15,21 +15,26 @@
 # limitations under the License.
 #
 import codecs
+import csv
+import logging
 import time
 import zipfile
 
 import requests
-from six import string_types, BytesIO, StringIO, PY2, PY3
+from requests.exceptions import HTTPError
+from six import string_types, BytesIO, PY2, PY3
+
 from .models import WrappedJson
 from .utils import conf_to_xml
-import csv
 
+logger = logging.getLogger(__name__)
 long_type = int
 
 if PY3:
     from collections.abc import Iterable as Iterable
 elif PY2:
     from collections import Iterable as Iterable
+
     long_type = long
 
 
@@ -70,6 +75,7 @@
                  }
 default_mapping = lambda x: x
 
+
 class LensQueryResult(Iterable):
     def __init__(self, custom_mappings=None):
         if custom_mappings is None:
@@ -93,6 +99,7 @@
         for row in self.rows:
             yield list(self._mapping(value.type)(value.value) if value else None for value in row['values'])
 
+
 class LensPersistentResult(LensQueryResult):
     def __init__(self, header, response, encoding=None, is_header_present=True, delimiter=",",
                  custom_mappings=None):
@@ -107,6 +114,11 @@
     def _parse_line(self, line):
         return list(self._mapping(self.header.columns[index].type)(line[index]) for index in range(len(line)))
 
+    def get_csv_reader(self, file):
+        if PY3:
+            file = codecs.iterdecode(file, 'utf-8')
+        return csv.reader(file, delimiter=self.delimiter)
+
     def __iter__(self):
         if self.is_zipped:
             byte_stream = BytesIO(self.response.content)
@@ -114,7 +126,7 @@
                 for name in self.zipfile.namelist():
                     with self.zipfile.open(name) as single_file:
                         if name[-3:] == 'csv':
-                            reader = csv.reader(single_file, delimiter=self.delimiter)
+                            reader = self.get_csv_reader(single_file)
                         else:
                             reader = single_file
                         reader_iterator = iter(reader)
@@ -142,7 +154,8 @@
         self.launched_queries = []
         self.finished_queries = {}
         self.query_confs = {}
-        self.is_header_present_in_result = self._session['lens.query.output.write.header'].lower() in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup']
+        self.is_header_present_in_result = self._session['lens.query.output.write.header'].lower() \
+                                           in ['true', '1', 't', 'y', 'yes', 'yeah', 'yup']
 
     def __call__(self, **filters):
         filters['sessionid'] = self._session._sessionid
@@ -183,6 +196,7 @@
         payload.append(('conf', conf_to_xml(conf)))
         resp = requests.post(self.base_url + "queries/", files=payload, headers={'accept': 'application/json'})
         query = self.sanitize_response(resp)
+        logger.info("Submitted query %s", query)
         if conf:
             self.query_confs[str(query)] = conf
         if fetch_result:
@@ -216,7 +230,8 @@
                 return LensPersistentResult(metadata, resp, is_header_present=is_header_present, *args, **kwargs)
             else:
                 response = requests.get(self.base_url + "queries/" + handle + "/resultset",
-                                    params={'sessionid': self._session._sessionid}, headers={'accept': 'application/json'})
+                                        params={'sessionid': self._session._sessionid},
+                                        headers={'accept': 'application/json'})
                 resp = self.sanitize_response(response)
                 # If it has in memory result, return inmemory result iterator
                 if resp._is_wrapper and resp._wrapped_key == u'inMemoryQueryResult':
@@ -228,13 +243,18 @@
             raise Exception("Result set not available")
 
     def sanitize_response(self, resp):
-        resp.raise_for_status()
         try:
             resp_json = resp.json(object_hook=WrappedJson)
+        except:
+            resp_json = resp.json()
+        if resp_json is not None:
             if 'lensAPIResult' in resp_json:
                 resp_json = resp_json.lens_a_p_i_result
                 if 'error' in resp_json:
-                    raise Exception(resp_json['error'])
+                    error = resp_json['error']
+                    if "stackTrace" in error:
+                        logger.error(error['stackTrace'])
+                    raise HTTPError(error, request=resp.request, response=resp)
                 if 'data' in resp_json:
                     data = resp_json.data
                     if len(data) == 2 and 'type' in data:
@@ -242,6 +262,9 @@
                         keys.remove('type')
                         return WrappedJson({data['type']: data[keys[0]]})
                     return data
-        except:
-            resp_json = resp.json()
-        return resp_json
+        if resp_json is not None:
+            return resp_json
+        else:
+            resp.raise_for_status()
+        logger.error(resp.text)
+        raise Exception("Unknown error with response", resp)
diff --git a/contrib/clients/python/setup.py b/contrib/clients/python/setup.py
index 113205d..de59d32 100644
--- a/contrib/clients/python/setup.py
+++ b/contrib/clients/python/setup.py
@@ -45,6 +45,8 @@
     def run_tests(self):
         #import here, cause outside the eggs aren't loaded
         import tox
+        import os
+        del os.environ["PYTHONPATH"]
         errcode = tox.cmdline(self.test_args)
         sys.exit(errcode)
 
diff --git a/contrib/clients/python/test/test_lensclient.py b/contrib/clients/python/test/test_lensclient.py
index e9b0bdb..b8d7c73 100644
--- a/contrib/clients/python/test/test_lensclient.py
+++ b/contrib/clients/python/test/test_lensclient.py
@@ -29,7 +29,9 @@
 from requests.exceptions import HTTPError
 
 from lens.client import LensClient
-
+import logging
+logger = logging.getLogger(__name__)
+logging.basicConfig(level="DEBUG")
 
 def check_output(command):
     output = subprocess.check_output(command.split())
@@ -85,11 +87,14 @@
         cls.base_path = glob.glob(joined)[0]
         with cwd(cls.base_path):
             with cwd('server'):
+                logger.info("Inside server directory")
                 server_start_output = check_output("bin/lens-ctl restart")
                 assert "Started lens server" in server_start_output
                 assert os.path.exists('logs/server.pid')
+                logger.info("started lens server")
                 time.sleep(1)
                 while not os.path.exists('logs/lensserver.log'):
+                    logger.info("waiting for lensserver.log to be created")
                     error = get_error()
                     if has_error(error):
                         # Assert again with complete error
@@ -97,9 +102,11 @@
                     time.sleep(1)
                 error = get_error()
                 if has_error(error):
+                    logger.error(error)
                     assert False, error
-
+            logger.info("finished setting up server environment. Will setup client now")
             with cwd('client'):
+                logger.info("Inside client directory")
                 cls.candidate_query = select_query('examples/resources/cube-queries.sql')
                 with open('check_connection.sql', 'w') as f:
                     f.write('show databases')
@@ -160,7 +167,7 @@
             handle = client.queries.submit(self.candidate_query, query_name="Candidate Query")
             finished_query = client.queries.wait_till_finish(handle)
             assert client.queries[handle] == finished_query
-            queries = client.queries(state='SUCCESSFUL', fromDate=finished_query.submission_time - 1,
+            queries = client.queries(state='successful,failed', fromDate=finished_query.submission_time - 1,
                                      toDate=finished_query.submission_time + 1)
             assert handle in queries
 
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
index 7608a43..b445447 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
@@ -307,6 +307,17 @@
     }
   }
 
+  public void createCubeFactTable(String cubeName, String factName, List<FieldSchema> columns,
+    Map<String, Set<UpdatePeriod>> storageAggregatePeriods, double weight, Map<String, String> properties,
+    Map<String, StorageTableDesc> storageTableDescs, Map<String, Map<UpdatePeriod, String>> storageUpdatePeriodMap)
+    throws LensException {
+    CubeFactTable factTable = new CubeFactTable(cubeName, factName, columns, storageAggregatePeriods, weight,
+      properties, storageUpdatePeriodMap);
+    createCubeTable(factTable, storageTableDescs);
+    // do a get to update cache
+    getCubeFact(factName);
+
+  }
 
   public <T extends Equals & HashCode & ToString> void createEntity(T entity) throws LensException {
     if (entity instanceof XStorage) {
@@ -362,17 +373,6 @@
       JAXBUtils.tableDescPrefixMapFromXStorageTables(fact.getStorageTables()),
       JAXBUtils.storageTablePrefixMapOfStorage(fact.getStorageTables()));
   }
-  public void createCubeFactTable(String cubeName, String factName, List<FieldSchema> columns,
-    Map<String, Set<UpdatePeriod>> storageAggregatePeriods, double weight, Map<String, String> properties,
-    Map<String, StorageTableDesc> storageTableDescs, Map<String, Map<UpdatePeriod, String>> storageUpdatePeriodMap)
-    throws LensException {
-    CubeFactTable factTable = new CubeFactTable(cubeName, factName, columns, storageAggregatePeriods, weight,
-      properties, storageUpdatePeriodMap);
-    createCubeTable(factTable, storageTableDescs);
-    // do a get to update cache
-    getCubeFact(factName);
-
-  }
 
 
   /**
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
index 76e5f23..e5cf916 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
@@ -141,6 +141,7 @@
     Set<Dimension> rewriteDenormctx(CubeQueryContext cubeql,
       StorageCandidate sc, Map<Dimension, CandidateDim> dimsToQuery, boolean replaceFact) throws LensException {
       Set<Dimension> refTbls = new HashSet<>();
+      log.info("Doing denorm changes for fact :{}", sc);
 
       if (!tableToRefCols.isEmpty()) {
         // pick referenced columns for fact
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
index 97a9ef0..aaa183b 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/ExpressionResolver.java
@@ -393,7 +393,7 @@
             pickExpressionsForTable(cdim);
           }
         }
-        log.debug("Picked expressions: {}", pickedExpressions);
+        log.info("Picked expressions: {}", pickedExpressions);
         for (Set<PickedExpression> peSet : pickedExpressions.values()) {
           for (PickedExpression pe : peSet) {
             exprDims.addAll(pe.pickedCtx.exprDims);
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
index 860db28..62d7386 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
@@ -525,8 +525,6 @@
     return expected.toString();
   }
 
-  private Set<ExprColumn> exprs;
-
   private void assertTestFactTimelineClass(CubeMetastoreClient client) throws Exception {
     String factName = "testFact";
 
diff --git a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
index abaae5b..194b380 100644
--- a/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
+++ b/lens-server/src/main/java/org/apache/lens/server/metastore/CubeMetastoreServiceImpl.java
@@ -226,8 +226,6 @@
    */
   @Override
   public void createDimensionTable(LensSessionHandle sessionid, XDimensionTable xDimTable) throws LensException {
-    String dimTblName = xDimTable.getTableName();
-
     try (SessionContext ignored = new SessionContext(sessionid)){
       getClient(sessionid).createCubeDimensionTable(xDimTable);
       log.info("Dimension Table created " + xDimTable.getTableName());
diff --git a/tools/conf/server/lens-site.xml b/tools/conf/server/lens-site.xml
index b53ff25..c303198 100644
--- a/tools/conf/server/lens-site.xml
+++ b/tools/conf/server/lens-site.xml
@@ -36,4 +36,10 @@
   <name>datanucleus.schema.autoCreateTables</name>
   <value>true</value>
 </property>
+
+<property>
+  <name>hive.metastore.schema.verification</name>
+  <value>false</value>
+</property>
+
 </configuration>