You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by pa...@apache.org on 2015/04/25 01:22:36 UTC

[01/11] drill git commit: DRILL-2350: Improve exception handling and error messages in JSON reader.

Repository: drill
Updated Branches:
  refs/heads/master eb199d614 -> 7289cabb5


DRILL-2350: Improve exception handling and error messages in JSON reader.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/319b94c0
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/319b94c0
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/319b94c0

Branch: refs/heads/master
Commit: 319b94c01c798af0ff0ff95b8b3af2e80d2a5ef7
Parents: eb199d6
Author: Parth Chandra <pc...@maprtech.com>
Authored: Thu Apr 9 17:11:14 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:53 2015 -0700

----------------------------------------------------------------------
 .../src/main/codegen/includes/vv_imports.ftl    |  3 +
 .../src/main/codegen/templates/ListWriters.java | 23 +++--
 .../exec/store/easy/json/JSONRecordReader.java  | 23 ++---
 .../exec/store/easy/json/JsonProcessor.java     | 13 +++
 .../easy/json/reader/BaseJsonProcessor.java     | 26 ++++++
 .../exec/vector/complex/fn/JsonReader.java      | 97 ++++++++++++++------
 .../exec/store/json/TestJsonRecordReader.java   | 18 ++++
 .../test/resources/jsoninput/DRILL-2350.json    |  1 +
 8 files changed, 160 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/codegen/includes/vv_imports.ftl
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/includes/vv_imports.ftl b/exec/java-exec/src/main/codegen/includes/vv_imports.ftl
index 371d8d0..d0f6291 100644
--- a/exec/java-exec/src/main/codegen/includes/vv_imports.ftl
+++ b/exec/java-exec/src/main/codegen/includes/vv_imports.ftl
@@ -21,9 +21,12 @@ import io.netty.buffer.*;
 
 import org.apache.commons.lang3.ArrayUtils;
 
+import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.exec.expr.fn.impl.StringFunctionUtil;
 import org.apache.drill.exec.memory.*;
 import org.apache.drill.exec.proto.SchemaDefProtos;
+import org.apache.drill.exec.proto.UserBitShared;
+import org.apache.drill.exec.proto.UserBitShared.DrillPBError;
 import org.apache.drill.exec.proto.UserBitShared.SerializedField;
 import org.apache.drill.exec.record.*;
 import org.apache.drill.exec.vector.*;

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/codegen/templates/ListWriters.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/templates/ListWriters.java b/exec/java-exec/src/main/codegen/templates/ListWriters.java
index 29708d7..6df4248 100644
--- a/exec/java-exec/src/main/codegen/templates/ListWriters.java
+++ b/exec/java-exec/src/main/codegen/templates/ListWriters.java
@@ -97,8 +97,8 @@ public class ${mode}ListWriter extends AbstractFieldWriter{
     case IN_MAP:
       return writer;
     }
-    
-    throw new IllegalStateException(String.format("Needed to be in state INIT or IN_MAP but in mode %s", mode.name()));
+
+  throw UserException.unsupportedError().message(getUnsupportedErrorMsg("MAP", mode.name())).build();
 
   }
   
@@ -116,8 +116,8 @@ public class ${mode}ListWriter extends AbstractFieldWriter{
     case IN_LIST:
       return writer;
     }
-    
-    throw new IllegalStateException(String.format("Needed to be in state INIT or IN_LIST but in mode %s", mode.name()));
+
+  throw UserException.unsupportedError().message(getUnsupportedErrorMsg("LIST", mode.name())).build();
 
   }
   
@@ -143,8 +143,9 @@ public class ${mode}ListWriter extends AbstractFieldWriter{
     case IN_${upperName}:
       return writer;
     }
-    
-    throw new IllegalStateException(String.format("Needed to be in state INIT or IN_${upperName} but in mode %s", mode.name()));
+
+  throw UserException.unsupportedError().message(getUnsupportedErrorMsg("${upperName}", mode.name())).build();
+
   }
   </#list></#list>
 
@@ -198,7 +199,15 @@ public class ${mode}ListWriter extends AbstractFieldWriter{
   }
   </#if>
 
-}
+  private String getUnsupportedErrorMsg(String expected, String found ){
+    String f = found.substring(3);
+    return String.format("In a list of type %s, encountered a value of type %s. "+
+      "Drill does not support lists of different types.",
+       f, expected
+    );
+  }
+
+  }
 </#list>
 
 

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java
index b41de31..2cccc64 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JSONRecordReader.java
@@ -124,7 +124,7 @@ public class JSONRecordReader extends AbstractRecordReader {
       }
       setupParser();
     }catch(final Exception e){
-      handleAndRaise("Failure reading JSON file.", e);
+      handleAndRaise("Failure reading JSON file", e);
     }
   }
 
@@ -159,12 +159,15 @@ public class JSONRecordReader extends AbstractRecordReader {
       columnNr = ex.getLocation().getColumnNr();
     }
 
-    throw UserException.dataReadError(e)
-      .message("%s - %s", suffix, message)
-      .addContext("Filename", hadoopPath.toUri().getPath())
-      .addContext("Record", recordCount + 1)
-      .addContext("Column", columnNr)
-      .build();
+    UserException.Builder exceptionBuilder = UserException.dataReadError(e)
+            .message("%s - %s", suffix, message);
+    if (columnNr > 0) {
+      exceptionBuilder.pushContext("Column ", columnNr);
+    }
+    exceptionBuilder.pushContext("Record ", recordCount + 1)
+            .pushContext("File ", hadoopPath.toUri().getPath());
+
+    throw exceptionBuilder.build();
   }
 
 
@@ -208,10 +211,8 @@ public class JSONRecordReader extends AbstractRecordReader {
 
       return recordCount;
 
-    } catch (final JsonParseException e) {
-      handleAndRaise("Error parsing JSON.", e);
-    } catch (final IOException e) {
-      handleAndRaise("Error reading JSON.", e);
+    } catch (final Exception e) {
+      handleAndRaise("Error parsing JSON", e);
     }
     // this is never reached
     return 0;

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java
index b310818..4d8d4ba 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/JsonProcessor.java
@@ -20,6 +20,8 @@ package org.apache.drill.exec.store.easy.json;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.drill.common.exceptions.UserException;
+import org.apache.drill.exec.proto.UserBitShared;
 import org.apache.drill.exec.vector.complex.writer.BaseWriter;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -37,4 +39,15 @@ public interface JsonProcessor {
   void setSource(JsonNode node);
 
   void ensureAtLeastOneField(BaseWriter.ComplexWriter writer);
+
+  public UserException.Builder getExceptionWithContext(UserException.Builder exceptionBuilder,
+                                                       String field,
+                                                       String msg,
+                                                       Object... args);
+
+  public UserException.Builder getExceptionWithContext(Throwable exception,
+                                                       String field,
+                                                       String msg,
+                                                       Object... args);
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java
index 718bb09..7833631 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/easy/json/reader/BaseJsonProcessor.java
@@ -29,6 +29,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.TreeTraversingParser;
 import com.google.common.base.Preconditions;
+import org.apache.drill.common.exceptions.UserException;
 
 public abstract class BaseJsonProcessor implements JsonProcessor {
 
@@ -53,4 +54,29 @@ public abstract class BaseJsonProcessor implements JsonProcessor {
     this.parser = new TreeTraversingParser(node);
   }
 
+  @Override
+  public UserException.Builder getExceptionWithContext(UserException.Builder exceptionBuilder,
+                                                       String field,
+                                                       String msg,
+                                                       Object... args) {
+    if (msg != null){
+      exceptionBuilder.message(msg, args);
+    }
+    if(field!=null) {
+      exceptionBuilder.pushContext("Field ", field);
+    }
+    exceptionBuilder.pushContext("Column ", parser.getCurrentLocation().getColumnNr()+1)
+            .pushContext("Line ", parser.getCurrentLocation().getLineNr());
+    return exceptionBuilder;
+  }
+
+  @Override
+  public UserException.Builder getExceptionWithContext(Throwable e,
+                                                       String field,
+                                                       String msg,
+                                                       Object... args) {
+    UserException.Builder exceptionBuilder = UserException.dataReadError(e);
+    return getExceptionWithContext(exceptionBuilder, field, msg, args);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java
index c196fd2..696fe7a 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/vector/complex/fn/JsonReader.java
@@ -23,7 +23,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
-import org.apache.drill.common.exceptions.DrillRuntimeException;
+import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.common.expression.PathSegment;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.exec.physical.base.GroupScan;
@@ -65,6 +65,10 @@ public class JsonReader extends BaseJsonProcessor {
    * Whether the reader is currently in a situation where we are unwrapping an outer list.
    */
   private boolean inOuterList;
+  /**
+   * The name of the current field being parsed. For Error messages.
+   */
+  private String currentFieldName;
 
   private FieldSelection selection;
 
@@ -82,6 +86,7 @@ public class JsonReader extends BaseJsonProcessor {
     this.columns = columns;
     this.mapOutput = new MapVectorOutput(workingBuffer);
     this.listOutput = new ListVectorOutput(workingBuffer);
+    this.currentFieldName="<none>";
   }
 
   @Override
@@ -146,7 +151,11 @@ public class JsonReader extends BaseJsonProcessor {
     case WRITE_SUCCEED:
       break;
     default:
-      throw new IllegalStateException();
+      throw
+        getExceptionWithContext(
+          UserException.dataReadError(), currentFieldName, null)
+          .message("Failure while reading JSON. (Got an invalid read state %s )", readState.toString())
+          .build();
     }
 
     return readState;
@@ -155,9 +164,13 @@ public class JsonReader extends BaseJsonProcessor {
   private void confirmLast() throws IOException{
     parser.nextToken();
     if(!parser.isClosed()){
-      throw new JsonParseException("Drill attempted to unwrap a toplevel list "
-        + "in your document.  However, it appears that there is trailing content after this top level list.  Drill only "
-        + "supports querying a set of distinct maps or a single json array with multiple inner maps.", parser.getCurrentLocation());
+      throw
+        getExceptionWithContext(
+          UserException.dataReadError(), currentFieldName, null)
+        .message("Drill attempted to unwrap a toplevel list "
+          + "in your document.  However, it appears that there is trailing content after this top level list.  Drill only "
+          + "supports querying a set of distinct maps or a single json array with multiple inner maps.")
+        .build();
     }
   }
 
@@ -168,8 +181,12 @@ public class JsonReader extends BaseJsonProcessor {
       break;
     case START_ARRAY:
       if(inOuterList){
-        throw new JsonParseException("The top level of your document must either be a single array of maps or a set "
-            + "of white space delimited maps.", parser.getCurrentLocation());
+        throw
+          getExceptionWithContext(
+            UserException.dataReadError(), currentFieldName, null)
+          .message("The top level of your document must either be a single array of maps or a set "
+            + "of white space delimited maps.")
+          .build();
       }
 
       if(skipOuterList){
@@ -178,8 +195,12 @@ public class JsonReader extends BaseJsonProcessor {
           inOuterList = true;
           writeDataSwitch(writer.rootAsMap());
         }else{
-          throw new JsonParseException("The top level of your document must either be a single array of maps or a set "
-              + "of white space delimited maps.", parser.getCurrentLocation());
+          throw
+            getExceptionWithContext(
+              UserException.dataReadError(), currentFieldName, null)
+            .message("The top level of your document must either be a single array of maps or a set "
+              + "of white space delimited maps.")
+            .build();
         }
 
       }else{
@@ -192,16 +213,22 @@ public class JsonReader extends BaseJsonProcessor {
         confirmLast();
         return ReadState.END_OF_STREAM;
       }else{
-        throw new JsonParseException(String.format("Failure while parsing JSON.  Ran across unexpected %s.", JsonToken.END_ARRAY), parser.getCurrentLocation());
+        throw
+          getExceptionWithContext(
+            UserException.dataReadError(), currentFieldName, null)
+          .message("Failure while parsing JSON.  Ran across unexpected %s.", JsonToken.END_ARRAY)
+          .build();
       }
 
     case NOT_AVAILABLE:
       return ReadState.END_OF_STREAM;
     default:
-      throw new JsonParseException(String.format(
-          "Failure while parsing JSON.  Found token of [%s]  Drill currently only supports parsing "
-              + "json strings that contain either lists or maps.  The root object cannot be a scalar.", t),
-          parser.getCurrentLocation());
+      throw
+        getExceptionWithContext(
+          UserException.dataReadError(), currentFieldName, null)
+          .message("Failure while parsing JSON.  Found token of [%s].  Drill currently only supports parsing "
+              + "json strings that contain either lists or maps.  The root object cannot be a scalar.", t)
+          .build();
     }
 
     return ReadState.WRITE_SUCCEED;
@@ -266,7 +293,7 @@ public class JsonReader extends BaseJsonProcessor {
       assert t == JsonToken.FIELD_NAME : String.format("Expected FIELD_NAME but got %s.", t.name());
 
       final String fieldName = parser.getText();
-
+      this.currentFieldName = fieldName;
       FieldSelection childSelection = selection.getChild(fieldName);
       if (childSelection.isNeverValid()) {
         consumeEntireNextValue();
@@ -312,8 +339,11 @@ public class JsonReader extends BaseJsonProcessor {
         break;
 
       default:
-        throw new IllegalStateException("Unexpected token " + parser.getCurrentToken());
-
+        throw
+          getExceptionWithContext(
+            UserException.dataReadError(), currentFieldName, null)
+          .message("Unexpected token %s", parser.getCurrentToken())
+          .build();
       }
 
     }
@@ -343,6 +373,7 @@ public class JsonReader extends BaseJsonProcessor {
       assert t == JsonToken.FIELD_NAME : String.format("Expected FIELD_NAME but got %s.", t.name());
 
       final String fieldName = parser.getText();
+      this.currentFieldName = fieldName;
       FieldSelection childSelection = selection.getChild(fieldName);
       if (childSelection.isNeverValid()) {
         consumeEntireNextValue();
@@ -375,8 +406,11 @@ public class JsonReader extends BaseJsonProcessor {
         break;
 
       default:
-        throw new IllegalStateException("Unexpected token " + parser.getCurrentToken());
-
+        throw
+          getExceptionWithContext(
+            UserException.dataReadError(), currentFieldName, null)
+          .message("Unexpected token %s", parser.getCurrentToken())
+          .build();
       }
     }
     map.end();
@@ -426,7 +460,7 @@ public class JsonReader extends BaseJsonProcessor {
   private void writeData(ListWriter list) throws IOException {
     list.start();
     outside: while (true) {
-
+      try {
       switch (parser.nextToken()) {
       case START_ARRAY:
         writeData(list.list());
@@ -452,9 +486,11 @@ public class JsonReader extends BaseJsonProcessor {
         break;
       }
       case VALUE_NULL:
-        throw new DrillRuntimeException("Drill does not currently null values in lists. "
-            + "Please set `store.json.all_text_mode` to true to read lists containing nulls. "
-            + "Be advised that this will treat JSON null values as string containing the word 'null'.");
+        throw UserException.unsupportedError()
+          .message("Null values are not supported in lists by default. " +
+            "Please set `store.json.all_text_mode` to true to read lists containing nulls. " +
+            "Be advised that this will treat JSON null values as a string containing the word 'null'.")
+          .build();
       case VALUE_NUMBER_FLOAT:
         list.float8().writeFloat8(parser.getDoubleValue());
         atLeastOneWrite = true;
@@ -468,8 +504,13 @@ public class JsonReader extends BaseJsonProcessor {
         atLeastOneWrite = true;
         break;
       default:
-        throw new IllegalStateException("Unexpected token " + parser.getCurrentToken());
-      }
+        throw UserException.dataReadError()
+          .message("Unexpected token %s", parser.getCurrentToken())
+          .build();
+    }
+    } catch (Exception e) {
+      throw getExceptionWithContext(e, this.currentFieldName, null).build();
+    }
     }
     list.end();
 
@@ -503,7 +544,11 @@ public class JsonReader extends BaseJsonProcessor {
         atLeastOneWrite = true;
         break;
       default:
-        throw new IllegalStateException("Unexpected token " + parser.getCurrentToken());
+        throw
+          getExceptionWithContext(
+            UserException.dataReadError(), currentFieldName, null)
+          .message("Unexpected token %s", parser.getCurrentToken())
+          .build();
       }
     }
     list.end();

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
index 8b09e80..44e2a2d 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
@@ -18,7 +18,12 @@
 package org.apache.drill.exec.store.json;
 
 import org.apache.drill.BaseTestQuery;
+import org.apache.drill.common.exceptions.UserException;
+import org.apache.drill.exec.proto.UserBitShared;
 import org.junit.Test;
+import org.junit.Assert;
+
+import static org.junit.Assert.assertEquals;
 
 
 public class TestJsonRecordReader extends BaseTestQuery{
@@ -68,4 +73,17 @@ public class TestJsonRecordReader extends BaseTestQuery{
     testNoResult("alter session set `store.json.all_text_mode`= true");
     test("select * from cp.`jsoninput/big_numeric.json`");
   }
+
+  @Test
+  public void testExceptionHandling() throws Exception {
+    try {
+      test("select * from cp.`jsoninput/DRILL-2350.json`");
+    } catch(UserException e) {
+      Assert.assertEquals(UserBitShared.DrillPBError.ErrorType.UNSUPPORTED_OPERATION, e.getOrCreatePBError(false).getErrorType());
+      String s = e.getMessage();
+      assertEquals("Expected Unsupported Operation Exception.", true, s.contains("Drill does not support lists of different types."));
+    }
+
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/319b94c0/exec/java-exec/src/test/resources/jsoninput/DRILL-2350.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/jsoninput/DRILL-2350.json b/exec/java-exec/src/test/resources/jsoninput/DRILL-2350.json
new file mode 100644
index 0000000..3433e89
--- /dev/null
+++ b/exec/java-exec/src/test/resources/jsoninput/DRILL-2350.json
@@ -0,0 +1 @@
+{ "loc" : [ -75.2, 40 ] }


[07/11] drill git commit: DRILL-2782: 2-Core: Decide, implement behavior for transaction-related JDBC methods.

Posted by pa...@apache.org.
DRILL-2782: 2-Core:  Decide, implement behavior for transaction-related JDBC methods.

- Added unit test.
- Added implementations of transaction-related methods:
  - setAutoCommit - reject attempt to turn auto-commit off
  - commit - reject when in auto-commit mode (which is always)
  - rollback - reject when in auto-commit mode (which is always)
  - other mode and metadata methods - roughly, report "no transactions"
- Added method declarations with doc. comments in Drill-specific interface.
- Overrode SQLLine's default transaction isolation level to Drill's
  TRANSACTION_NONE.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/ce9fc3af
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/ce9fc3af
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/ce9fc3af

Branch: refs/heads/master
Commit: ce9fc3af45dfa047bc05d2a009c7f09b6b501d00
Parents: 6e477e2
Author: dbarclay <db...@maprtech.com>
Authored: Tue Apr 14 16:13:23 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:54 2015 -0700

----------------------------------------------------------------------
 distribution/src/resources/sqlline              |   8 +
 distribution/src/resources/sqlline.bat          |   7 +
 .../org/apache/drill/jdbc/DrillConnection.java  | 116 +++++++++++++
 .../apache/drill/jdbc/DrillConnectionImpl.java  | 109 ++++++++++++
 .../jdbc/ConnectionTransactionMethodsTest.java  | 168 +++++++++++++++++++
 .../apache/drill/jdbc/DatabaseMetaDataTest.java |  86 ++++++++++
 6 files changed, 494 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/distribution/src/resources/sqlline
----------------------------------------------------------------------
diff --git a/distribution/src/resources/sqlline b/distribution/src/resources/sqlline
old mode 100755
new mode 100644
index 0852fba..48a5169
--- a/distribution/src/resources/sqlline
+++ b/distribution/src/resources/sqlline
@@ -34,8 +34,16 @@ bin=`cd "$bin">/dev/null; pwd`
 
 . "$bin"/drill-config.sh
 
+# Override SQLLine's default initial transaction isolation level.  (SQLLine
+# sets an initial level instead of leaving it at whatever the Driver's default
+# is.) 
+# Put our property specification before previous value of DRILL_SHELL_JAVA_OPTS
+# so that it can still be overridden via DRILL_SHELL_JAVA_OPTS.
+DRILL_SHELL_JAVA_OPTS="-Dsqlline.isolation=TRANSACTION_NONE $DRILL_SHELL_JAVA_OPTS"
+
 DRILL_SHELL_JAVA_OPTS="$DRILL_SHELL_JAVA_OPTS -Dlog.path=$DRILL_LOG_DIR/sqlline.log"
 
+
 if [ -n "$QUERY" ] ; then
   echo $QUERY | exec "$JAVA" $DRILL_SHELL_JAVA_OPTS $DRILL_JAVA_OPTS -cp $CP sqlline.SqlLine -d org.apache.drill.jdbc.Driver  --maxWidth=10000 "${ARGS[@]}"
 elif [ -n "$FILE" ] ; then

http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/distribution/src/resources/sqlline.bat
----------------------------------------------------------------------
diff --git a/distribution/src/resources/sqlline.bat b/distribution/src/resources/sqlline.bat
index 755526c..2564b8c 100755
--- a/distribution/src/resources/sqlline.bat
+++ b/distribution/src/resources/sqlline.bat
@@ -169,6 +169,13 @@ set DRILL_CP=%DRILL_CP%;%DRILL_HOME%\jars\3rdparty\*
 set DRILL_CP=%DRILL_CP%;%DRILL_HOME%\jars\classb\*
 if NOT "test%DRILL_CLASSPATH%"=="test" set DRILL_CP=!DRILL_CP!;%DRILL_CLASSPATH%
 
+rem Override SQLLine's default initial transaction isolation level.  (SQLLine
+rem sets an initial level instead of leaving it at whatever the Driver's default
+rem is.) 
+rem Put our property specification before previous value of DRILL_SHELL_JAVA_OPTS
+rem so that it can still be overridden via DRILL_SHELL_JAVA_OPTS.
+set DRILL_SHELL_JAVA_OPTS=-Dsqlline.isolation=TRANSACTION_NONE %DRILL_SHELL_JAVA_OPTS%
+
 set DRILL_SHELL_JAVA_OPTS=%DRILL_SHELL_JAVA_OPTS% -Dlog.path="%DRILL_LOG_DIR%\sqlline.log"
 
 SET JAVA_CMD=%JAVA_HOME%\bin\%JAVA_EXE%

http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
index 6bacaad..33acb42 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
@@ -20,6 +20,8 @@ package org.apache.drill.jdbc;
 
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Savepoint;
 
 import org.apache.drill.exec.client.DrillClient;
 
@@ -30,6 +32,120 @@ import org.apache.drill.exec.client.DrillClient;
  */
 public interface DrillConnection extends Connection {
 
+
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Drill's implementation accepts {@code DrillConnection.class}.
+   * </p>
+   */
+  @Override
+  <T> T unwrap(Class<T> iface) throws SQLException;
+
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Drill's implementation returns true for {@code DrillConnection.class}.
+   * </p>
+   */
+  @Override
+  boolean isWrapperFor(Class<?> iface) throws SQLException;
+
+
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Accepts only {@code true}.
+   * </p>
+   * @throws SQLFeatureNotSupportedException if called with {@code false}
+   */
+  @Override
+  void setAutoCommit(boolean autoCommit) throws SQLFeatureNotSupportedException,
+                                                SQLException;
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Drill's implementation always returns {@code true}.
+   * </p>
+   */
+  @Override
+  boolean getAutoCommit() throws SQLException;
+
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException})..
+   */
+  @Override
+  void commit() throws SQLException;
+
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException}).
+   */
+  @Override
+  void rollback() throws SQLException;
+
+
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Accepts only {@link Connection.TRANSACTION_NONE}.
+   * </p>
+   *
+   * @throws SQLFeatureNotSupportedException if {@code level} is not
+   * {@link Connection.TRANSACTION_NONE}.
+   */
+  @Override
+  void setTransactionIsolation(int level) throws SQLFeatureNotSupportedException,
+                                                 SQLException;
+
+  /**
+   * {@inheritDoc}
+   * <p>
+   *   <strong>Drill</strong>:
+   *   Drill's implementation always returns {@link Connection#TRANSACTION_NONE}.
+   * </p>
+   */
+  @Override
+  int getTransactionIsolation() throws SQLException;
+
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException}).
+   */
+  @Override
+  Savepoint setSavepoint() throws SQLException;
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException}).
+   */
+  @Override
+  Savepoint setSavepoint(String name) throws SQLException;
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException}).
+   */
+  @Override
+  void rollback(Savepoint savepoint) throws SQLException;
+
+  /**
+   * Not supported.  Always throws {@link SQLFeatureNotSupportedException} (or
+   * {@link AlreadyClosedSqlException}).
+   */
+  @Override
+  void releaseSavepoint(Savepoint savepoint) throws SQLException;
+
+
   // In java.sql.Connection from JDK 1.7, but declared here to allow other JDKs.
   void setSchema(String schema) throws SQLException;
 

http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
index 79852a0..7c690d8 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
@@ -20,6 +20,8 @@ package org.apache.drill.jdbc;
 import java.io.IOException;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Savepoint;
 import java.util.Properties;
 import java.util.TimeZone;
 
@@ -61,6 +63,11 @@ public abstract class DrillConnectionImpl extends AvaticaConnection
 
   protected DrillConnectionImpl(Driver driver, AvaticaFactory factory, String url, Properties info) throws SQLException {
     super(driver, factory, url, info);
+
+    // Initialize transaction-related settings per Drill behavior.
+    super.setTransactionIsolation( TRANSACTION_NONE );
+    super.setAutoCommit( true );
+
     this.config = new DrillConnectionConfig(info);
 
     try {
@@ -149,6 +156,108 @@ public abstract class DrillConnectionImpl extends AvaticaConnection
   }
 
   @Override
+  public void setAutoCommit( boolean autoCommit ) throws SQLException {
+    checkNotClosed();
+    if ( ! autoCommit ) {
+      throw new SQLFeatureNotSupportedException(
+          "Can't turn off auto-committing; transactions are not supported.  "
+          + "(Drill is not transactional.)" );
+    }
+    assert getAutoCommit() : "getAutoCommit() = " + getAutoCommit();
+  }
+
+  @Override
+  public void commit() throws SQLException  {
+    checkNotClosed();
+    if ( getAutoCommit()  ) {
+      throw new JdbcApiSqlException( "Can't call commit() in auto-commit mode." );
+    }
+    else {
+      // (Currently not reachable.)
+      throw new SQLFeatureNotSupportedException(
+          "Connection.commit() is not supported.  (Drill is not transactional.)" );
+    }
+  }
+
+  @Override
+  public void rollback() throws SQLException {
+    checkNotClosed();
+    if ( getAutoCommit()  ) {
+      throw new JdbcApiSqlException( "Can't call rollback() in auto-commit mode." );
+    }
+    else {
+      // (Currently not reachable.)
+      throw new SQLFeatureNotSupportedException(
+          "Connection.rollback() is not supported.  (Drill is not transactional.)" );
+    }
+  }
+
+  @Override
+  public Savepoint setSavepoint() throws SQLException {
+    checkNotClosed();
+    throw new SQLFeatureNotSupportedException(
+        "Savepoints are not supported.  (Drill is not transactional.)" );
+  }
+
+  @Override
+  public Savepoint setSavepoint(String name) throws SQLException {
+    checkNotClosed();
+    throw new SQLFeatureNotSupportedException(
+        "Savepoints are not supported.  (Drill is not transactional.)" );
+  }
+
+  @Override
+    public void rollback(Savepoint savepoint) throws SQLException {
+    checkNotClosed();
+    throw new SQLFeatureNotSupportedException(
+        "Savepoints are not supported.  (Drill is not transactional.)" );
+  }
+
+  @Override
+  public void releaseSavepoint(Savepoint savepoint) throws SQLException {
+    checkNotClosed();
+    throw new SQLFeatureNotSupportedException(
+        "Savepoints are not supported.  (Drill is not transactional.)" );
+  }
+
+
+  private String isolationValueToString( final int level ) {
+    switch ( level ) {
+      case TRANSACTION_NONE:             return "TRANSACTION_NONE";
+      case TRANSACTION_READ_UNCOMMITTED: return "TRANSACTION_READ_UNCOMMITTED";
+      case TRANSACTION_READ_COMMITTED:   return "TRANSACTION_READ_COMMITTED";
+      case TRANSACTION_REPEATABLE_READ:  return "TRANSACTION_REPEATABLE_READ";
+      case TRANSACTION_SERIALIZABLE:     return "TRANSACTION_SERIALIZABLE";
+      default:
+        return "<Unknown transaction isolation level value " + level + ">";
+    }
+  }
+
+  @Override
+  public void setTransactionIsolation(int level) throws SQLException {
+    checkNotClosed();
+    switch ( level ) {
+      case TRANSACTION_NONE:
+        // No-op.  (Is already set in constructor, and we disallow changing it.)
+        break;
+      case TRANSACTION_READ_UNCOMMITTED:
+      case TRANSACTION_READ_COMMITTED:
+      case TRANSACTION_REPEATABLE_READ:
+      case TRANSACTION_SERIALIZABLE:
+          throw new SQLFeatureNotSupportedException(
+              "Can't change transaction isolation level to Connection."
+              + isolationValueToString( level ) + " (from Connection."
+              + isolationValueToString( getTransactionIsolation() ) + ")."
+              + "  (Drill is not transactional.)" );
+      default:
+        // Invalid value (or new one unknown to code).
+        throw new JdbcApiSqlException(
+            "Invalid transaction isolation level value " + level );
+        //break;
+    }
+  }
+
+  @Override
   public DrillStatement createStatement(int resultSetType, int resultSetConcurrency,
                                         int resultSetHoldability) throws SQLException {
     checkNotClosed();

http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/exec/jdbc/src/test/java/org/apache/drill/jdbc/ConnectionTransactionMethodsTest.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/ConnectionTransactionMethodsTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/ConnectionTransactionMethodsTest.java
new file mode 100644
index 0000000..dd92c9b
--- /dev/null
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/ConnectionTransactionMethodsTest.java
@@ -0,0 +1,168 @@
+/**
+ * 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.drill.jdbc;
+
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.*;
+import org.apache.drill.jdbc.Driver;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static java.sql.Connection.*;
+import java.sql.Connection;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Savepoint;
+import java.sql.SQLException;
+
+
+/**
+ * Test for Drill's implementation of Connection's main transaction-related
+ * methods.
+ */
+public class ConnectionTransactionMethodsTest {
+
+  private static Connection connection;
+
+  @BeforeClass
+  public static void setUpConnection() throws SQLException {
+    connection = new Driver().connect( "jdbc:drill:zk=local", null );
+  }
+
+  @AfterClass
+  public static void tearDownConnection() throws SQLException {
+    connection.close();
+  }
+
+
+  ////////////////////////////////////////
+  // Transaction mode methods:
+
+  //////////
+  // Transaction isolation level:
+
+  @Test
+  public void testGetTransactionIsolationSaysNone() throws SQLException {
+    assertThat( connection.getTransactionIsolation(), equalTo( TRANSACTION_NONE ) );
+  }
+
+  @Test
+  public void testSetTransactionIsolationNoneExitsNormally() throws SQLException {
+    connection.setTransactionIsolation( TRANSACTION_NONE );
+  }
+
+  // Test trying to set to unsupported isolation levels:
+
+  // (Sample message:  "Can't change transaction isolation level to
+  // Connection.TRANSACTION_REPEATABLE_READ (from Connection.TRANSACTION_NONE).
+  // (Drill is not transactional.)" (as of 2015-04-22))
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetTransactionIsolationReadUncommittedThrows() throws SQLException {
+    try {
+      connection.setTransactionIsolation( TRANSACTION_READ_UNCOMMITTED );
+    }
+    catch ( SQLFeatureNotSupportedException e ) {
+      // Check a few things in an error message:
+      assertThat( "Missing requested-level string",
+                  e.getMessage(), containsString( "TRANSACTION_READ_UNCOMMITTED" ) );
+      assertThat( "Missing (or reworded) expected description",
+                  e.getMessage(), containsString( "transaction isolation level" ) );
+      assertThat( "Missing current-level string",
+                  e.getMessage(), containsString( "TRANSACTION_NONE" ) );
+      throw e;
+    }
+  }
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetTransactionIsolationReadCommittedThrows() throws SQLException {
+    connection.setTransactionIsolation( TRANSACTION_READ_COMMITTED );
+  }
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetTransactionIsolationRepeatableReadThrows() throws SQLException {
+    connection.setTransactionIsolation( TRANSACTION_REPEATABLE_READ );
+  }
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetTransactionIsolationSerializableThrows() throws SQLException {
+    connection.setTransactionIsolation( TRANSACTION_SERIALIZABLE );
+  }
+
+  @Test( expected = JdbcApiSqlException.class )
+  public void testSetTransactionIsolationBadIntegerThrows() throws SQLException {
+    connection.setTransactionIsolation( 15 );  // not any TRANSACTION_* value
+  }
+
+
+  //////////
+  // Auto-commit mode.
+
+  @Test
+  public void testGetAutoCommitSaysAuto() throws SQLException {
+    // Auto-commit should always be true.
+    assertThat( connection.getAutoCommit(), equalTo( true ) );
+  }
+
+  @Test
+  public void testSetAutoCommitTrueExitsNormally() throws SQLException {
+    // Setting auto-commit true (redundantly) shouldn't throw exception.
+    connection.setAutoCommit( true );
+  }
+
+
+  ////////////////////////////////////////
+  // Transaction operation methods:
+
+  @Test( expected = JdbcApiSqlException.class )
+  public void testCommitThrows() throws SQLException {
+    // Should fail saying because in auto-commit mode (or maybe because not
+    // supported).
+    connection.commit();
+  }
+
+  @Test( expected = JdbcApiSqlException.class )
+  public void testRollbackThrows() throws SQLException {
+    // Should fail saying because in auto-commit mode (or maybe because not
+    // supported).
+    connection.rollback();
+  }
+
+
+  ////////////////////////////////////////
+  // Savepoint methods:
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetSavepointUnamed() throws SQLException {
+    connection.setSavepoint();
+  }
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testSetSavepointNamed() throws SQLException {
+    connection.setSavepoint( "savepoint name" );
+  }
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testRollbackSavepoint() throws SQLException {
+    connection.rollback( (Savepoint) null );
+  }
+
+  @Test( expected = SQLFeatureNotSupportedException.class )
+  public void testReleaseSavepoint() throws SQLException {
+    connection.releaseSavepoint( (Savepoint) null );
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/ce9fc3af/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataTest.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataTest.java
new file mode 100644
index 0000000..8b885a4
--- /dev/null
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataTest.java
@@ -0,0 +1,86 @@
+/**
+ * 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.drill.jdbc;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.*;
+import org.apache.drill.jdbc.Driver;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+import static java.sql.Connection.*;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Savepoint;
+import java.sql.SQLException;
+
+/**
+ * Test for Drill's implementation of DatabaseMetaData's methods (other than
+ * those tested separately, e.g., {@code getColumn(...)}, tested in
+ * {@link DatabaseMetaDataGetColumnsTest})).
+ */
+public class DatabaseMetaDataTest {
+
+  private static Connection connection;
+
+  @BeforeClass
+  public static void setUpConnection() throws SQLException {
+    connection = new Driver().connect( "jdbc:drill:zk=local", null );
+  }
+
+  @AfterClass
+  public static void tearDownConnection() throws SQLException {
+    connection.close();
+  }
+
+  @Test
+  public void testGetDefaultTransactionIsolationSaysNone() throws SQLException {
+    final DatabaseMetaData md = connection.getMetaData();
+    assertThat( md.getDefaultTransactionIsolation(), equalTo( TRANSACTION_NONE ) );
+  }
+
+  @Test
+  public void testSupportsTransactionsSaysNo() throws SQLException {
+    assertThat( connection.getMetaData().supportsTransactions(), equalTo( false ) );
+  }
+
+  @Test
+  public void testSupportsTransactionIsolationLevelNoneSaysYes()
+      throws SQLException {
+    final DatabaseMetaData md = connection.getMetaData();
+    assertTrue( md.supportsTransactionIsolationLevel( TRANSACTION_NONE ) );
+  }
+
+  @Test
+  public void testSupportsTransactionIsolationLevelOthersSayNo()
+      throws SQLException {
+    final DatabaseMetaData md = connection.getMetaData();
+    assertFalse( md.supportsTransactionIsolationLevel( TRANSACTION_READ_UNCOMMITTED ) );
+    assertFalse( md.supportsTransactionIsolationLevel( TRANSACTION_READ_COMMITTED ) );
+    assertFalse( md.supportsTransactionIsolationLevel( TRANSACTION_REPEATABLE_READ ) );
+    assertFalse( md.supportsTransactionIsolationLevel( TRANSACTION_SERIALIZABLE ) );
+  }
+
+}


[10/11] drill git commit: DRILL-2829: Info. schema hygiene (for upcoming fixes).

Posted by pa...@apache.org.
DRILL-2829: Info. schema hygiene (for upcoming fixes).

- Clarified column constant names.  Also grouped and ordered them.
- Added/applied constant for catalog name "DRILL".
- Fixed "implements ...Constants" old-Java hack (to static imports).
- Purged some unused imports.
- A little documentation, editing, TODOs.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/1aad02c5
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/1aad02c5
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/1aad02c5

Branch: refs/heads/master
Commit: 1aad02c51a762364c2964cf7b60c141419a02bcc
Parents: 9e4c016
Author: dbarclay <db...@maprtech.com>
Authored: Fri Apr 17 11:36:46 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:55 2015 -0700

----------------------------------------------------------------------
 .../sql/handlers/DescribeTableHandler.java      | 31 +++++-----
 .../sql/handlers/ShowSchemasHandler.java        | 11 ++--
 .../planner/sql/handlers/ShowTablesHandler.java | 12 ++--
 .../apache/drill/exec/store/AbstractSchema.java |  9 +++
 .../exec/store/ischema/InfoSchemaConstants.java | 65 +++++++++++++-------
 .../store/ischema/InfoSchemaFilterBuilder.java  | 12 ++--
 .../store/ischema/InfoSchemaStoragePlugin.java  |  6 +-
 .../exec/store/ischema/InfoSchemaTable.java     | 62 ++++++++++---------
 .../exec/store/ischema/RecordGenerator.java     | 47 +++++++++-----
 .../drill/exec/store/ischema/Records.java       |  3 +-
 .../drill/exec/store/ischema/SelectedTable.java | 12 +++-
 .../drill/exec/store/sys/SystemTable.java       | 10 +--
 12 files changed, 177 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java
index 15721d5..c76914b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DescribeTableHandler.java
@@ -26,13 +26,11 @@ import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.tools.Planner;
 import org.apache.calcite.tools.RelConversionException;
 
-import org.apache.drill.exec.ops.QueryContext;
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.exec.planner.sql.parser.DrillParserUtil;
 import org.apache.drill.exec.planner.sql.parser.SqlDescribeTable;
 import org.apache.drill.exec.store.AbstractSchema;
-import org.apache.drill.exec.store.ischema.InfoSchemaConstants;
 import org.apache.drill.exec.work.foreman.ForemanSetupException;
-import org.apache.calcite.plan.hep.HepPlanner;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
@@ -44,7 +42,7 @@ import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
-public class DescribeTableHandler extends DefaultSqlHandler implements InfoSchemaConstants {
+public class DescribeTableHandler extends DefaultSqlHandler {
 
   public DescribeTableHandler(SqlHandlerConfig config) { super(config); }
 
@@ -54,9 +52,10 @@ public class DescribeTableHandler extends DefaultSqlHandler implements InfoSchem
     SqlDescribeTable node = unwrap(sqlNode, SqlDescribeTable.class);
 
     try {
-      List<SqlNode> selectList = ImmutableList.of((SqlNode) new SqlIdentifier(COL_COLUMN_NAME, SqlParserPos.ZERO),
-          new SqlIdentifier(COL_DATA_TYPE, SqlParserPos.ZERO),
-          new SqlIdentifier(COL_IS_NULLABLE, SqlParserPos.ZERO));
+      List<SqlNode> selectList =
+          ImmutableList.of((SqlNode) new SqlIdentifier(COLS_COL_COLUMN_NAME, SqlParserPos.ZERO),
+                                     new SqlIdentifier(COLS_COL_DATA_TYPE, SqlParserPos.ZERO),
+                                     new SqlIdentifier(COLS_COL_IS_NULLABLE, SqlParserPos.ZERO));
 
       SqlNode fromClause = new SqlIdentifier(
           ImmutableList.of(IS_SCHEMA_NAME, TAB_COLUMNS), null, SqlParserPos.ZERO, null);
@@ -75,14 +74,14 @@ public class DescribeTableHandler extends DefaultSqlHandler implements InfoSchem
         AbstractSchema drillSchema = getDrillSchema(schema);
 
         schemaCondition = DrillParserUtil.createCondition(
-            new SqlIdentifier(COL_TABLE_SCHEMA, SqlParserPos.ZERO),
+            new SqlIdentifier(SHRD_COL_TABLE_SCHEMA, SqlParserPos.ZERO),
             SqlStdOperatorTable.EQUALS,
             SqlLiteral.createCharString(drillSchema.getFullSchemaName(), CHARSET, SqlParserPos.ZERO)
         );
       }
 
       SqlNode where = DrillParserUtil.createCondition(
-          new SqlIdentifier(COL_TABLE_NAME, SqlParserPos.ZERO),
+          new SqlIdentifier(SHRD_COL_TABLE_NAME, SqlParserPos.ZERO),
           SqlStdOperatorTable.EQUALS,
           SqlLiteral.createCharString(tableName, CHARSET, SqlParserPos.ZERO));
 
@@ -90,12 +89,16 @@ public class DescribeTableHandler extends DefaultSqlHandler implements InfoSchem
 
       SqlNode columnFilter = null;
       if (node.getColumn() != null) {
-        columnFilter = DrillParserUtil.createCondition(new SqlIdentifier(COL_COLUMN_NAME, SqlParserPos.ZERO),
-            SqlStdOperatorTable.EQUALS,
-            SqlLiteral.createCharString(node.getColumn().toString(), CHARSET, SqlParserPos.ZERO));
+        columnFilter =
+            DrillParserUtil.createCondition(
+                new SqlIdentifier(COLS_COL_COLUMN_NAME, SqlParserPos.ZERO),
+                SqlStdOperatorTable.EQUALS,
+                SqlLiteral.createCharString(node.getColumn().toString(), CHARSET, SqlParserPos.ZERO));
       } else if (node.getColumnQualifier() != null) {
-        columnFilter = DrillParserUtil.createCondition(new SqlIdentifier(COL_COLUMN_NAME, SqlParserPos.ZERO),
-            SqlStdOperatorTable.LIKE, node.getColumnQualifier());
+        columnFilter =
+            DrillParserUtil.createCondition(
+                new SqlIdentifier(COLS_COL_COLUMN_NAME, SqlParserPos.ZERO),
+                SqlStdOperatorTable.LIKE, node.getColumnQualifier());
       }
 
       where = DrillParserUtil.createCondition(where, SqlStdOperatorTable.AND, columnFilter);

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowSchemasHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowSchemasHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowSchemasHandler.java
index a037be3..d759d1e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowSchemasHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowSchemasHandler.java
@@ -24,7 +24,7 @@ import org.apache.calcite.tools.RelConversionException;
 
 import org.apache.drill.exec.planner.sql.parser.DrillParserUtil;
 import org.apache.drill.exec.planner.sql.parser.SqlShowSchemas;
-import org.apache.drill.exec.store.ischema.InfoSchemaConstants;
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.exec.work.foreman.ForemanSetupException;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
@@ -35,7 +35,7 @@ import org.apache.calcite.sql.parser.SqlParserPos;
 
 import com.google.common.collect.ImmutableList;
 
-public class ShowSchemasHandler extends DefaultSqlHandler implements InfoSchemaConstants {
+public class ShowSchemasHandler extends DefaultSqlHandler {
 
   public ShowSchemasHandler(SqlHandlerConfig config) { super(config); }
 
@@ -43,7 +43,8 @@ public class ShowSchemasHandler extends DefaultSqlHandler implements InfoSchemaC
   @Override
   public SqlNode rewrite(SqlNode sqlNode) throws RelConversionException, ForemanSetupException {
     SqlShowSchemas node = unwrap(sqlNode, SqlShowSchemas.class);
-    List<SqlNode> selectList = ImmutableList.of((SqlNode) new SqlIdentifier(COL_SCHEMA_NAME, SqlParserPos.ZERO));
+    List<SqlNode> selectList =
+        ImmutableList.of((SqlNode) new SqlIdentifier(SCHS_COL_SCHEMA_NAME, SqlParserPos.ZERO));
 
     SqlNode fromClause = new SqlIdentifier(
         ImmutableList.of(IS_SCHEMA_NAME, TAB_SCHEMATA), null, SqlParserPos.ZERO, null);
@@ -51,8 +52,8 @@ public class ShowSchemasHandler extends DefaultSqlHandler implements InfoSchemaC
     SqlNode where = null;
     final SqlNode likePattern = node.getLikePattern();
     if (likePattern != null) {
-      where = DrillParserUtil.createCondition(new SqlIdentifier(COL_SCHEMA_NAME, SqlParserPos.ZERO),
-          SqlStdOperatorTable.LIKE, likePattern);
+      where = DrillParserUtil.createCondition(new SqlIdentifier(SCHS_COL_SCHEMA_NAME, SqlParserPos.ZERO),
+                                              SqlStdOperatorTable.LIKE, likePattern);
     } else if (node.getWhereClause() != null) {
       where = node.getWhereClause();
     }

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowTablesHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowTablesHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowTablesHandler.java
index 4ac81e9..3d42f76 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowTablesHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ShowTablesHandler.java
@@ -28,7 +28,7 @@ import org.apache.calcite.tools.RelConversionException;
 import org.apache.drill.exec.planner.sql.parser.DrillParserUtil;
 import org.apache.drill.exec.planner.sql.parser.SqlShowTables;
 import org.apache.drill.exec.store.AbstractSchema;
-import org.apache.drill.exec.store.ischema.InfoSchemaConstants;
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.exec.work.foreman.ForemanSetupException;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlLiteral;
@@ -41,7 +41,7 @@ import org.apache.calcite.sql.parser.SqlParserPos;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-public class ShowTablesHandler extends DefaultSqlHandler implements InfoSchemaConstants {
+public class ShowTablesHandler extends DefaultSqlHandler {
 
   public ShowTablesHandler(SqlHandlerConfig config) { super(config); }
 
@@ -54,8 +54,8 @@ public class ShowTablesHandler extends DefaultSqlHandler implements InfoSchemaCo
     SqlNode where;
 
     // create select columns
-    selectList.add(new SqlIdentifier(COL_TABLE_SCHEMA, SqlParserPos.ZERO));
-    selectList.add(new SqlIdentifier(COL_TABLE_NAME, SqlParserPos.ZERO));
+    selectList.add(new SqlIdentifier(SHRD_COL_TABLE_SCHEMA, SqlParserPos.ZERO));
+    selectList.add(new SqlIdentifier(SHRD_COL_TABLE_NAME, SqlParserPos.ZERO));
 
     fromClause = new SqlIdentifier(ImmutableList.of(IS_SCHEMA_NAME, TAB_TABLES), SqlParserPos.ZERO);
 
@@ -84,7 +84,7 @@ public class ShowTablesHandler extends DefaultSqlHandler implements InfoSchemaCo
     }
 
     where = DrillParserUtil.createCondition(
-        new SqlIdentifier(COL_TABLE_SCHEMA, SqlParserPos.ZERO),
+        new SqlIdentifier(SHRD_COL_TABLE_SCHEMA, SqlParserPos.ZERO),
         SqlStdOperatorTable.EQUALS,
         SqlLiteral.createCharString(tableSchema, CHARSET, SqlParserPos.ZERO));
 
@@ -92,7 +92,7 @@ public class ShowTablesHandler extends DefaultSqlHandler implements InfoSchemaCo
     final SqlNode likePattern = node.getLikePattern();
     if (likePattern != null) {
       filter = DrillParserUtil.createCondition(
-          new SqlIdentifier(COL_TABLE_NAME, SqlParserPos.ZERO),
+          new SqlIdentifier(SHRD_COL_TABLE_NAME, SqlParserPos.ZERO),
           SqlStdOperatorTable.LIKE,
           likePattern);
     } else if (node.getWhereClause() != null) {

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java
index 2d6ac4f..33ddea5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/AbstractSchema.java
@@ -92,6 +92,15 @@ public abstract class AbstractSchema implements Schema, SchemaPartitionExplorer
     throw new UnsupportedOperationException("New tables are not allowed in this schema");
   }
 
+  /**
+   * Reports whether to show items from this schema in INFORMATION_SCHEMA
+   * tables.
+   * (Controls ... TODO:  Doc.:  Mention what this typically controls or
+   * affects.)
+   * <p>
+   *   This base implementation returns {@code true}.
+   * </p>
+   */
   public boolean showInInformationSchema() {
     return true;
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaConstants.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaConstants.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaConstants.java
index 8350d89..1c29235 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaConstants.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaConstants.java
@@ -17,35 +17,58 @@
  */
 package org.apache.drill.exec.store.ischema;
 
-public interface InfoSchemaConstants {
+public final class InfoSchemaConstants {
+  /** Prevents instantiation. */
+  private InfoSchemaConstants() {
+  }
+
+  /** Name of catalog containing information schema. */
+  public static final String IS_CATALOG_NAME = "DRILL";
+
+  /** Name of information schema. */
   public static final String IS_SCHEMA_NAME = "INFORMATION_SCHEMA";
 
+  // TODO:  Resolve how to not have two different place defining table names:
+  // NOTE: These string values have to match the identifiers for SelectedTable's
+  // enumerators.
+  // Information schema's tables' names:
   public static final String TAB_CATALOGS = "CATALOGS";
   public static final String TAB_COLUMNS = "COLUMNS";
   public static final String TAB_SCHEMATA = "SCHEMATA";
   public static final String TAB_TABLES = "TABLES";
   public static final String TAB_VIEWS = "VIEWS";
 
+  // CATALOGS column names:
+  public static final String CATS_COL_CATALOG_CONNECT = "CATALOG_CONNECT";
+  public static final String CATS_COL_CATALOG_DESCRIPTION = "CATALOG_DESCRIPTION";
+  public static final String CATS_COL_CATALOG_NAME = "CATALOG_NAME";
+
+  // SCHEMATA column names:
+  public static final String SCHS_COL_CATALOG_NAME = "CATALOG_NAME";
+  public static final String SCHS_COL_SCHEMA_NAME = "SCHEMA_NAME";
+  public static final String SCHS_COL_SCHEMA_OWNER = "SCHEMA_OWNER";
+  public static final String SCHS_COL_TYPE = "TYPE";
+  public static final String SCHS_COL_IS_MUTABLE = "IS_MUTABLE";
+
+  // Common TABLES / VIEWS / COLUMNS columns names:
+  public static final String SHRD_COL_TABLE_CATALOG = "TABLE_CATALOG";
+  public static final String SHRD_COL_TABLE_SCHEMA = "TABLE_SCHEMA";
+  public static final String SHRD_COL_TABLE_NAME = "TABLE_NAME";
+
+  // Remaining TABLES column names:
+  public static final String TBLS_COL_TABLE_TYPE = "TABLE_TYPE";
+
+  // Remaining VIEWS column names:
+  public static final String VIEWS_COL_VIEW_DEFINITION = "VIEW_DEFINITION";
 
-  public static final String COL_CATALOG_CONNECT = "CATALOG_CONNECT";
-  public static final String COL_CATALOG_DESCRIPTION = "CATALOG_DESCRIPTION";
-  public static final String COL_CATALOG_NAME = "CATALOG_NAME";
-  public static final String COL_COLUMN_NAME = "COLUMN_NAME";
-  public static final String COL_CHARACTER_MAXIMUM_LENGTH = "CHARACTER_MAXIMUM_LENGTH";
-  public static final String COL_DATA_TYPE = "DATA_TYPE";
-  public static final String COL_IS_MUTABLE = "IS_MUTABLE";
-  public static final String COL_IS_NULLABLE = "IS_NULLABLE";
-  public static final String COL_NUMERIC_PRECISION = "NUMERIC_PRECISION";
-  public static final String COL_NUMERIC_PRECISION_RADIX = "NUMERIC_PRECISION_RADIX";
-  public static final String COL_NUMERIC_SCALE = "NUMERIC_SCALE";
-  public static final String COL_ORDINAL_POSITION = "ORDINAL_POSITION";
-  public static final String COL_SCHEMA_NAME = "SCHEMA_NAME";
-  public static final String COL_SCHEMA_OWNER = "SCHEMA_OWNER";
-  public static final String COL_TYPE = "TYPE";
-  public static final String COL_TABLE_NAME = "TABLE_NAME";
-  public static final String COL_TABLE_SCHEMA = "TABLE_SCHEMA";
-  public static final String COL_TABLE_CATALOG = "TABLE_CATALOG";
-  public static final String COL_TABLE_TYPE = "TABLE_TYPE";
-  public static final String COL_VIEW_DEFINITION = "VIEW_DEFINITION";
+  // Remaining COLUMNS column names:
+  public static final String COLS_COL_COLUMN_NAME = "COLUMN_NAME";
+  public static final String COLS_COL_ORDINAL_POSITION = "ORDINAL_POSITION";
+  public static final String COLS_COL_IS_NULLABLE = "IS_NULLABLE";
+  public static final String COLS_COL_DATA_TYPE = "DATA_TYPE";
+  public static final String COLS_COL_CHARACTER_MAXIMUM_LENGTH = "CHARACTER_MAXIMUM_LENGTH";
+  public static final String COLS_COL_NUMERIC_PRECISION_RADIX = "NUMERIC_PRECISION_RADIX";
+  public static final String COLS_COL_NUMERIC_SCALE = "NUMERIC_SCALE";
+  public static final String COLS_COL_NUMERIC_PRECISION = "NUMERIC_PRECISION";
 
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaFilterBuilder.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaFilterBuilder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaFilterBuilder.java
index ddbbe51..9d0bc06 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaFilterBuilder.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaFilterBuilder.java
@@ -19,6 +19,7 @@ package org.apache.drill.exec.store.ischema;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.common.expression.BooleanOperator;
 import org.apache.drill.common.expression.CastExpression;
 import org.apache.drill.common.expression.FieldReference;
@@ -39,8 +40,7 @@ import java.util.List;
  * conditions involving columns "TABLE_NAME", "SCHEMA_NAME" and "TABLE_SCHEMA" and
  * functions EQUAL, NOT EQUAL, LIKE, OR and AND.
  */
-public class InfoSchemaFilterBuilder extends AbstractExprVisitor<ExprNode, Void, RuntimeException>
-    implements InfoSchemaConstants {
+public class InfoSchemaFilterBuilder extends AbstractExprVisitor<ExprNode, Void, RuntimeException> {
   private final LogicalExpression filter;
 
   private boolean isAllExpressionsConverted = true;
@@ -127,7 +127,9 @@ public class InfoSchemaFilterBuilder extends AbstractExprVisitor<ExprNode, Void,
     if (e.getInput() instanceof FieldReference) {
       FieldReference fieldRef = (FieldReference) e.getInput();
       String field = fieldRef.getAsUnescapedPath().toUpperCase();
-      if (field.equals(COL_SCHEMA_NAME) || field.equals(COL_TABLE_NAME) || field.equals(COL_TABLE_SCHEMA)) {
+      if (field.equals(SCHS_COL_SCHEMA_NAME)
+          || field.equals(SHRD_COL_TABLE_NAME)
+          || field.equals(SHRD_COL_TABLE_SCHEMA)) {
         return new FieldExprNode(field);
       }
     }
@@ -143,7 +145,9 @@ public class InfoSchemaFilterBuilder extends AbstractExprVisitor<ExprNode, Void,
   @Override
   public ExprNode visitSchemaPath(SchemaPath path, Void value) throws RuntimeException {
     String field = path.getAsUnescapedPath().toUpperCase();
-    if (field.equals(COL_SCHEMA_NAME) || field.equals(COL_TABLE_NAME) || field.equals(COL_TABLE_SCHEMA)) {
+    if (field.equals(SCHS_COL_SCHEMA_NAME)
+        || field.equals(SHRD_COL_TABLE_NAME)
+        || field.equals(SHRD_COL_TABLE_SCHEMA)) {
       return new FieldExprNode(field);
     }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
index 0a9c32c..597d24c 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaStoragePlugin.java
@@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableSet;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.schema.Table;
 
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.common.JSONOptions;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.logical.StoragePluginConfig;
@@ -39,7 +40,7 @@ import com.google.common.collect.Maps;
 import org.apache.drill.exec.store.SchemaConfig;
 import org.apache.drill.exec.store.StoragePluginOptimizerRule;
 
-public class InfoSchemaStoragePlugin extends AbstractStoragePlugin implements InfoSchemaConstants {
+public class InfoSchemaStoragePlugin extends AbstractStoragePlugin {
   static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(InfoSchemaStoragePlugin.class);
 
   private final InfoSchemaConfig config;
@@ -75,6 +76,9 @@ public class InfoSchemaStoragePlugin extends AbstractStoragePlugin implements In
     parent.add(s.getName(), s);
   }
 
+  /**
+   * Representation of the INFORMATION_SCHEMA schema.
+   */
   private class ISchema extends AbstractSchema{
     private Map<String, InfoSchemaDrillTable> tables;
     public ISchema(SchemaPlus parent, InfoSchemaStoragePlugin plugin){

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaTable.java
index 0e9ca53..0f8b8a0 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/InfoSchemaTable.java
@@ -19,6 +19,7 @@ package org.apache.drill.exec.store.ischema;
 
 import java.util.List;
 
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.common.types.TypeProtos.MajorType;
 import org.apache.drill.common.types.TypeProtos.MinorType;
 import org.apache.drill.common.types.Types;
@@ -29,8 +30,11 @@ import org.apache.calcite.sql.type.SqlTypeName;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-/** Base class of tables in INFORMATION_SCHEMA. Defines the table (fields and types) */
-public abstract class InfoSchemaTable implements InfoSchemaConstants{
+/**
+ * Base class for tables in INFORMATION_SCHEMA.  Defines the table (fields and
+ * types).
+ */
+public abstract class InfoSchemaTable {
 
   public static class Field {
     public String name;
@@ -86,9 +90,9 @@ public abstract class InfoSchemaTable implements InfoSchemaConstants{
   /** Layout for the CATALOGS table. */
   static public class Catalogs extends InfoSchemaTable {
     private static final List<Field> fields = ImmutableList.of(
-        Field.create(COL_CATALOG_NAME, VARCHAR),
-        Field.create(COL_CATALOG_DESCRIPTION, VARCHAR),
-        Field.create(COL_CATALOG_CONNECT, VARCHAR));
+        Field.create(CATS_COL_CATALOG_NAME, VARCHAR),
+        Field.create(CATS_COL_CATALOG_DESCRIPTION, VARCHAR),
+        Field.create(CATS_COL_CATALOG_CONNECT, VARCHAR));
 
     Catalogs() {
       super(TAB_CATALOGS, fields);
@@ -103,11 +107,11 @@ public abstract class InfoSchemaTable implements InfoSchemaConstants{
   /** Layout for the SCHEMATA table. */
   public static class Schemata extends InfoSchemaTable {
     private static final List<Field> fields = ImmutableList.of(
-        Field.create(COL_CATALOG_NAME, VARCHAR),
-        Field.create(COL_SCHEMA_NAME, VARCHAR),
-        Field.create(COL_SCHEMA_OWNER, VARCHAR),
-        Field.create(COL_TYPE, VARCHAR),
-        Field.create(COL_IS_MUTABLE, VARCHAR));
+        Field.create(SCHS_COL_CATALOG_NAME, VARCHAR),
+        Field.create(SCHS_COL_SCHEMA_NAME, VARCHAR),
+        Field.create(SCHS_COL_SCHEMA_OWNER, VARCHAR),
+        Field.create(SCHS_COL_TYPE, VARCHAR),
+        Field.create(SCHS_COL_IS_MUTABLE, VARCHAR));
 
     public Schemata() {
       super(TAB_SCHEMATA, fields);
@@ -122,10 +126,10 @@ public abstract class InfoSchemaTable implements InfoSchemaConstants{
   /** Layout for the TABLES table. */
   public static class Tables extends InfoSchemaTable {
     private static final List<Field> fields = ImmutableList.of(
-        Field.create(COL_TABLE_CATALOG, VARCHAR),
-        Field.create(COL_TABLE_SCHEMA, VARCHAR),
-        Field.create(COL_TABLE_NAME, VARCHAR),
-        Field.create(COL_TABLE_TYPE, VARCHAR));
+        Field.create(SHRD_COL_TABLE_CATALOG, VARCHAR),
+        Field.create(SHRD_COL_TABLE_SCHEMA, VARCHAR),
+        Field.create(SHRD_COL_TABLE_NAME, VARCHAR),
+        Field.create(TBLS_COL_TABLE_TYPE, VARCHAR));
 
     public Tables() {
       super(TAB_TABLES, fields);
@@ -140,10 +144,10 @@ public abstract class InfoSchemaTable implements InfoSchemaConstants{
   /** Layout for the VIEWS table. */
   static public class Views extends InfoSchemaTable {
     private static final List<Field> fields = ImmutableList.of(
-        Field.create(COL_TABLE_CATALOG, VARCHAR),
-        Field.create(COL_TABLE_SCHEMA, VARCHAR),
-        Field.create(COL_TABLE_NAME, VARCHAR),
-        Field.create(COL_VIEW_DEFINITION, VARCHAR));
+        Field.create(SHRD_COL_TABLE_CATALOG, VARCHAR),
+        Field.create(SHRD_COL_TABLE_SCHEMA, VARCHAR),
+        Field.create(SHRD_COL_TABLE_NAME, VARCHAR),
+        Field.create(VIEWS_COL_VIEW_DEFINITION, VARCHAR));
 
     public Views() {
       super(TAB_VIEWS, fields);
@@ -158,17 +162,17 @@ public abstract class InfoSchemaTable implements InfoSchemaConstants{
   /** Layout for the COLUMNS table. */
   public static class Columns extends InfoSchemaTable {
     private static final List<Field> fields = ImmutableList.of(
-        Field.create(COL_TABLE_CATALOG, VARCHAR),
-        Field.create(COL_TABLE_SCHEMA, VARCHAR),
-        Field.create(COL_TABLE_NAME, VARCHAR),
-        Field.create(COL_COLUMN_NAME, VARCHAR),
-        Field.create(COL_ORDINAL_POSITION, INT),
-        Field.create(COL_IS_NULLABLE, VARCHAR),
-        Field.create(COL_DATA_TYPE, VARCHAR),
-        Field.create(COL_CHARACTER_MAXIMUM_LENGTH, INT),
-        Field.create(COL_NUMERIC_PRECISION_RADIX, INT),
-        Field.create(COL_NUMERIC_SCALE, INT),
-        Field.create(COL_NUMERIC_PRECISION, INT));
+        Field.create(SHRD_COL_TABLE_CATALOG, VARCHAR),
+        Field.create(SHRD_COL_TABLE_SCHEMA, VARCHAR),
+        Field.create(SHRD_COL_TABLE_NAME, VARCHAR),
+        Field.create(COLS_COL_COLUMN_NAME, VARCHAR),
+        Field.create(COLS_COL_ORDINAL_POSITION, INT),
+        Field.create(COLS_COL_IS_NULLABLE, VARCHAR),
+        Field.create(COLS_COL_DATA_TYPE, VARCHAR),
+        Field.create(COLS_COL_CHARACTER_MAXIMUM_LENGTH, INT),
+        Field.create(COLS_COL_NUMERIC_PRECISION_RADIX, INT),
+        Field.create(COLS_COL_NUMERIC_SCALE, INT),
+        Field.create(COLS_COL_NUMERIC_PRECISION, INT));
 
     public Columns() {
       super(TAB_COLUMNS, fields);

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/RecordGenerator.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/RecordGenerator.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/RecordGenerator.java
index 772b9e4..c2a56ca 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/RecordGenerator.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/RecordGenerator.java
@@ -26,19 +26,23 @@ import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.schema.Table;
 import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 
+import static org.apache.drill.exec.store.ischema.InfoSchemaConstants.*;
 import org.apache.drill.exec.planner.logical.DrillViewInfoProvider;
 import org.apache.drill.exec.store.AbstractSchema;
 import org.apache.drill.exec.store.RecordReader;
 import org.apache.drill.exec.store.ischema.InfoSchemaFilter.Result;
 import org.apache.drill.exec.store.pojo.PojoRecordReader;
+
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeField;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-/** Generates records for POJO RecordReader by scanning the given schema */
-public abstract class RecordGenerator implements InfoSchemaConstants {
+/**
+ * Generates records for POJO RecordReader by scanning the given schema.
+ */
+public abstract class RecordGenerator {
   protected InfoSchemaFilter filter;
 
   public void setInfoSchemaFilter(InfoSchemaFilter filter) {
@@ -69,21 +73,25 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
         return false;
       }
 
-      Map<String, String> recordValues = ImmutableMap.of(COL_TABLE_SCHEMA, schemaName, COL_SCHEMA_NAME, schemaName);
+      Map<String, String> recordValues =
+          ImmutableMap.of(SHRD_COL_TABLE_SCHEMA, schemaName,
+                          SCHS_COL_SCHEMA_NAME, schemaName);
       if (filter != null && filter.evaluate(recordValues) == Result.FALSE) {
-        // If the filter evaluates to false then we don't need to visit the schema. For other two results (TRUE,
-        // INCONCLUSIVE) continue to visit the schema.
+        // If the filter evaluates to false then we don't need to visit the schema.
+        // For other two results (TRUE, INCONCLUSIVE) continue to visit the schema.
         return false;
       }
     } catch(ClassCastException e) {
-      // ignore and return true as this is not a drill schema
+      // ignore and return true as this is not a Drill schema
     }
     return true;
   }
 
   protected boolean shouldVisitTable(String schemaName, String tableName) {
-    Map<String, String> recordValues = ImmutableMap.of(
-        COL_TABLE_SCHEMA, schemaName, COL_SCHEMA_NAME, schemaName, COL_TABLE_NAME, tableName);
+    Map<String, String> recordValues =
+        ImmutableMap.of( SHRD_COL_TABLE_SCHEMA, schemaName,
+                         SCHS_COL_SCHEMA_NAME, schemaName,
+                         SHRD_COL_TABLE_NAME, tableName);
     if (filter != null && filter.evaluate(recordValues) == Result.FALSE) {
       return false;
     }
@@ -98,13 +106,13 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
   }
 
   /**
-   * Recursively scan the schema, invoking the visitor as appropriate.
-   * @param schemaPath - the path to the current schema, so far,
-   * @param schema - the current schema.
+   * Recursively scans the given schema, invoking the visitor as appropriate.
+   * @param  schemaPath  the path to the given schema, so far
+   * @param  schema  the given schema
    */
   private void scanSchema(String schemaPath, SchemaPlus schema) {
 
-    // Recursively scan the subschema.
+    // Recursively scan any subschema.
     for (String name: schema.getSubSchemaNames()) {
       scanSchema(schemaPath +
           (schemaPath == "" ? "" : ".") + // If we have an empty schema path, then don't insert a leading dot.
@@ -138,7 +146,9 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
   public static class Catalogs extends RecordGenerator {
     @Override
     public RecordReader getRecordReader() {
-      Records.Catalog catalogRecord = new Records.Catalog("DRILL", "The internal metadata used by Drill", "");
+      Records.Catalog catalogRecord =
+          new Records.Catalog(IS_CATALOG_NAME,
+                              "The internal metadata used by Drill", "");
       return new PojoRecordReader<>(Records.Catalog.class, ImmutableList.of(catalogRecord).iterator());
     }
   }
@@ -154,7 +164,8 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
     @Override
     public boolean visitSchema(String schemaName, SchemaPlus schema) {
       AbstractSchema as = schema.unwrap(AbstractSchema.class);
-      records.add(new Records.Schema("DRILL", schemaName, "<owner>", as.getTypeName(), as.isMutable()));
+      records.add(new Records.Schema(IS_CATALOG_NAME, schemaName, "<owner>",
+                                     as.getTypeName(), as.isMutable()));
       return false;
     }
   }
@@ -169,7 +180,8 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
 
     @Override
     public boolean visitTable(String schemaName, String tableName, Table table) {
-      records.add(new Records.Table("DRILL", schemaName, tableName, table.getJdbcTableType().toString()));
+      records.add(new Records.Table(IS_CATALOG_NAME, schemaName, tableName,
+                                    table.getJdbcTableType().toString()));
       return false;
     }
   }
@@ -185,7 +197,8 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
     @Override
     public boolean visitTable(String schemaName, String tableName, Table table) {
       if (table.getJdbcTableType() == TableType.VIEW) {
-        records.add(new Records.View("DRILL", schemaName, tableName, ((DrillViewInfoProvider) table).getViewSql()));
+        records.add(new Records.View(IS_CATALOG_NAME, schemaName, tableName,
+                    ((DrillViewInfoProvider) table).getViewSql()));
       }
       return false;
     }
@@ -201,7 +214,7 @@ public abstract class RecordGenerator implements InfoSchemaConstants {
 
     @Override
     public boolean visitField(String schemaName, String tableName, RelDataTypeField field) {
-      records.add(new Records.Column("DRILL", schemaName, tableName, field));
+      records.add(new Records.Column(IS_CATALOG_NAME, schemaName, tableName, field));
       return false;
     }
   }

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java
index f14fa7e..39b4f3e 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/Records.java
@@ -66,7 +66,8 @@ public class Records {
       this.IS_NULLABLE = type.isNullable() ? "YES" : "NO";
 
       if (sqlType == SqlTypeName.ARRAY || sqlType == SqlTypeName.MAP || sqlType == SqlTypeName.ROW) {
-        // For complex types use the toString method to display the inside elements
+        // For complex types use SqlTypeName's toString method to display the
+        // inside elements.
         String typeString = type.toString();
 
         // RelDataType.toString prints "RecordType" for "STRUCT".

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/SelectedTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/SelectedTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/SelectedTable.java
index 088736b..79e7fd2 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/SelectedTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/ischema/SelectedTable.java
@@ -28,7 +28,13 @@ import org.apache.drill.exec.store.ischema.InfoSchemaTable.Views;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 
+/**
+ * The set of tables/views in INFORMATION_SCHEMA.
+ */
 public enum SelectedTable{
+  // TODO:  Resolve how to not have two different place defining table names:
+  // NOTE: These identifiers have to match the string values in
+  // InfoSchemaConstants.
   CATALOGS(new Catalogs()),
   SCHEMATA(new Schemata()),
   VIEWS(new Views()),
@@ -37,6 +43,10 @@ public enum SelectedTable{
 
   private final InfoSchemaTable tableDef;
 
+  /**
+   * ...
+   * @param  tableDef  the definition (columns and data generator) of the table
+   */
   private SelectedTable(InfoSchemaTable tableDef) {
     this.tableDef = tableDef;
   }
@@ -51,4 +61,4 @@ public enum SelectedTable{
   public RelDataType getRowType(RelDataTypeFactory typeFactory) {
     return tableDef.getRowType(typeFactory);
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/drill/blob/1aad02c5/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTable.java
index 9a5aa65..bd23d81 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/sys/SystemTable.java
@@ -30,10 +30,12 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
 import java.util.Iterator;
 
 /**
- * An enumeration of all system tables that Drill supports.
- * <p/>
- * OPTION, DRILLBITS and VERSION are local tables available on every Drillbit.
- * MEMORY and THREADS are distributed tables with one record on every Drillbit.
+ * An enumeration of all tables in Drill's system ("sys") schema.
+ * <p>
+ *   OPTION, DRILLBITS and VERSION are local tables available on every Drillbit.
+ *   MEMORY and THREADS are distributed tables with one record on every
+ *   Drillbit.
+ * </p>
  */
 public enum SystemTable {
 


[11/11] drill git commit: DRILL-2548: JDBC Driver - check for bad data from server and prevent SqlException

Posted by pa...@apache.org.
DRILL-2548: JDBC Driver - check for bad data from server and prevent SqlException


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/7289cabb
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/7289cabb
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/7289cabb

Branch: refs/heads/master
Commit: 7289cabb5e7f9bed4a38607ccdfc09f803e2c235
Parents: 1aad02c
Author: Parth Chandra <pc...@maprtech.com>
Authored: Tue Mar 24 10:19:07 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:55 2015 -0700

----------------------------------------------------------------------
 exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/7289cabb/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java
index 857a885..41b89ce 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillCursor.java
@@ -114,10 +114,14 @@ public class DrillCursor implements Cursor {
       try {
         QueryDataBatch qrb = resultsListener.getNext();
         recordBatchCount++;
-        while (qrb != null && qrb.getHeader().getRowCount() == 0 && !first) {
+        while (qrb != null && (qrb.getHeader().getRowCount() == 0 || qrb.getData() == null ) && !first) {
           qrb.release();
           qrb = resultsListener.getNext();
           recordBatchCount++;
+          if(qrb != null && qrb.getData()==null){
+            qrb.release();
+            return false;
+          }
         }
 
         first = false;


[05/11] drill git commit: DRILL-1832: Add unit tests for Json file with null values

Posted by pa...@apache.org.
http://git-wip-us.apache.org/repos/asf/drill/blob/25ea3e83/exec/java-exec/src/test/resources/jsoninput/drill-1832-1-result.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/jsoninput/drill-1832-1-result.json b/exec/java-exec/src/test/resources/jsoninput/drill-1832-1-result.json
new file mode 100644
index 0000000..fb57962
--- /dev/null
+++ b/exec/java-exec/src/test/resources/jsoninput/drill-1832-1-result.json
@@ -0,0 +1,43 @@
+{"created_at":"Mon Nov 24 18:18:22 +0000 2014","id":536946943952707584,"id_str":"536946943952707584","text":"Ol\u00e1! Pe\u00e7a com Frete Gr\u00e1tis e Parcelamento em at\u00e9 12x SEM juros no cart\u00e3o!! #BlackFriday... http:\/\/t.co\/at01bG91Nj","source":"\u003ca href=\"http:\/\/www.facebook.com\/twitter\" rel=\"nofollow\"\u003eFacebook\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1080585416,"id_str":"1080585416","name":"Bela Elisha ","screen_name":"BelaElisha","location":"Rio de Janeiro","url":"http:\/\/www.belaelisha.com","description":"Loja de Folheados e Bijouterias. Nossos folheados t\u00eam 1 ano de garantia pelo fabricante e bijus finas, semi joias e moda praia. Conhe\u00e7a-nos!","protected":false,"verified":false,"followers_count":29,"friends_count":231,"listed_count":0,"favourites_count":17,"statuses_count":11344,"cr
 eated_at":"Fri Jan 11 18:45:10 +0000 2013","utc_offset":-7200,"time_zone":"Brasilia","geo_enabled":true,"lang":"pt","contributors_enabled":false,"is_translator":false,"profile_background_color":"BF2AB5","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/490205032990527490\/hJZGzgHX.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/490205032990527490\/hJZGzgHX.png","profile_background_tile":false,"profile_link_color":"EBAEEB","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/490205430287577089\/ctKYbfLq_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/490205430287577089\/ctKYbfLq_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/1080585416\/1410206362","default_profile":false,"default_profile_image
 ":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[75,87]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/at01bG91Nj","expanded_url":"http:\/\/fb.me\/6Nx5Rwa8W","display_url":"fb.me\/6Nx5Rwa8W","indices":[91,113]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"pt","timestamp_ms":"1416853102087"}
+{"created_at":"Mon Nov 24 18:18:22 +0000 2014","id":536946944724045825,"id_str":"536946944724045825","text":"http:\/\/t.co\/nTcavbq5Nt #BlackFriday #NEW 41\" CUTAWAY ACOUSTIC ELECTRIC NATURAL  STEEL STRING  GUITAR DE ROSA http:\/\/t.co\/oFbLFJLpWE","source":"\u003ca href=\"http:\/\/twifarm.goodfiles.net\" rel=\"nofollow\"\u003etwifarmtest\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1454645382,"id_str":"1454645382","name":"Yuliana Albasiny","screen_name":"AlbasinyYuliana","location":"Albuquerque","url":null,"description":"All about sex videos","protected":false,"verified":false,"followers_count":15,"friends_count":33,"listed_count":0,"favourites_count":0,"statuses_count":184,"created_at":"Fri May 24 16:38:35 +0000 2013","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":fa
 lse,"profile_background_color":"1A1B1F","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_tile":false,"profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3737792542\/c99b583c1cf476e1b8d6c44d8ef910c4_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3737792542\/c99b583c1cf476e1b8d6c44d8ef910c4_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]},{"text":"NEW","indices":[36,40]}],"tre
 nds":[],"urls":[{"url":"http:\/\/t.co\/nTcavbq5Nt","expanded_url":"http:\/\/ift.tt\/1yKdcsv","display_url":"ift.tt\/1yKdcsv","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536751006743539713,"id_str":"536751006743539713","indices":[109,131],"media_url":"http:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","url":"http:\/\/t.co\/oFbLFJLpWE","display_url":"pic.twitter.com\/oFbLFJLpWE","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536751006789689344\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}},"source_status_id":536751006789689344,"source_status_id_str":"536751006789689344"}]},"extended_entities":{"media":[{"id":536751006743539713,"id_str":"536751006743539713","indices":[109,131],"media_url":"http:\/\/pbs.twimg.com\/media\/B3LsMmHI
 MAEnQ9y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","url":"http:\/\/t.co\/oFbLFJLpWE","display_url":"pic.twitter.com\/oFbLFJLpWE","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536751006789689344\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}},"source_status_id":536751006789689344,"source_status_id_str":"536751006789689344"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"tl","timestamp_ms":"1416853102271"}
+{"created_at":"Mon Nov 24 18:18:26 +0000 2014","id":536946961153130496,"id_str":"536946961153130496","text":"RT @Rackspace: Don't miss our blog &amp; hangout about how our customer @bold_apps scales their apps for #BlackFriday &amp; #CyberMonday http:\/\/t.c\u2026","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":258827412,"id_str":"258827412","name":"\u0628\u062d\u0631\u0627\u0646\u064a","screen_name":"bhdba_info","location":"Bahrain","url":"http:\/\/www.oracle.com","description":"IT Manager, Databases Admin and Storage Design and Implementer(EMC),  Design and  Disaster Recovery Sites and Administrator Business Continuity  Solutions.","protected":false,"verified":false,"followers_count":117,"friends_count":411,"listed_count":8,"fa
 vourites_count":719,"statuses_count":3615,"created_at":"Mon Feb 28 15:54:24 +0000 2011","utc_offset":10800,"time_zone":"Kuwait","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/266458250\/OracleBuilding.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/266458250\/OracleBuilding.jpg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1387477954\/Oracle_DBA_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1387477954\/Oracle_DBA_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notificati
 ons":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon Nov 24 15:23:29 +0000 2014","id":536902935154659331,"id_str":"536902935154659331","text":"Don't miss our blog &amp; hangout about how our customer @bold_apps scales their apps for #BlackFriday &amp; #CyberMonday http:\/\/t.co\/tSt0UuASV5","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":26191233,"id_str":"26191233","name":"Rackspace","screen_name":"Rackspace","location":"San Antonio, TX","url":"http:\/\/www.rackspace.com","description":"The managed cloud company. Backed by Fanatical Support\u00ae. Questions? Reach us here: http:\/\/www.rackspace.com\/support","protected":false,"verified":true,"followers_count":79547,"friends_count":2197,"l
 isted_count":2177,"favourites_count":2080,"statuses_count":18396,"created_at":"Tue Mar 24 06:30:52 +0000 2009","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000109624749\/a1281727f93c953444546644f0c226ef.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000109624749\/a1281727f93c953444546644f0c226ef.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2820164575\/0226f9ef1173d90417e5113e25e0cc17_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2820164575\/0226f9ef117
 3d90417e5113e25e0cc17_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/26191233\/1405427913","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":12,"favorite_count":4,"entities":{"hashtags":[{"text":"BlackFriday","indices":[90,102]},{"text":"CyberMonday","indices":[109,121]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/tSt0UuASV5","expanded_url":"http:\/\/bit.ly\/1xTZczm","display_url":"bit.ly\/1xTZczm","indices":[122,144]}],"user_mentions":[{"screen_name":"bold_apps","name":"BOLDapps","id":543563317,"id_str":"543563317","indices":[57,67]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[105,117]},{"text":"CyberMonday","indices":[124,136]}],"trends":[],"urls"
 :[{"url":"http:\/\/t.co\/tSt0UuASV5","expanded_url":"http:\/\/bit.ly\/1xTZczm","display_url":"bit.ly\/1xTZczm","indices":[147,148]}],"user_mentions":[{"screen_name":"Rackspace","name":"Rackspace","id":26191233,"id_str":"26191233","indices":[3,13]},{"screen_name":"bold_apps","name":"BOLDapps","id":543563317,"id_str":"543563317","indices":[72,82]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853106188"}
+{"created_at":"Mon Nov 24 18:18:27 +0000 2014","id":536946966857396224,"id_str":"536946966857396224","text":"http:\/\/t.co\/0WolAvU579\n #isis #Obama #Democrats #BlackFriday #Republicans!","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1560154452,"id_str":"1560154452","name":"Akshay Chauhan","screen_name":"aksh27ay","location":"india","url":"http:\/\/www.latestdeviceinfo.blogspot.com\/","description":"http:\/\/xboxlivecodegenerator.in\/\r\n Put Your Cursor @@@@ Above\r\n\r\n____\u2591F\u2591O\u2591L\u2591L\u2591O\u2591W\u2591\u2591M\u2591E____","protected":false,"verified":false,"followers_count":359,"friends_count":1052,"listed_count":1,"favourites_count":1,"statuses_count":669,"created_at":"Mon Jul 01 10:11:55 +0000 2013","utc_
 offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/420444172240183296\/iw9BC4xd_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/420444172240183296\/iw9BC4xd_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/1560154452\/1389076719","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":nul
 l,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"isis","indices":[24,29]},{"text":"Obama","indices":[30,36]},{"text":"Democrats","indices":[37,47]},{"text":"BlackFriday","indices":[48,60]},{"text":"Republicans","indices":[61,73]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/0WolAvU579","expanded_url":"http:\/\/www.whatisroot.com\/how-to-root-samsung-galaxy-grand-duos\/","display_url":"whatisroot.com\/how-to-root-sa\u2026","indices":[0,22]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"und","timestamp_ms":"1416853107548"}
+{"created_at":"Mon Nov 24 18:18:28 +0000 2014","id":536946970217414656,"id_str":"536946970217414656","text":"Hey #frugal shoppers! Are you getting ready for #BlackFriday? Browse thousands of #deals and #coupons on ONE easy app http:\/\/t.co\/zv8wsr2xMv","source":"\u003ca href=\"http:\/\/www.hootsuite.com\" rel=\"nofollow\"\u003eHootsuite\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2541852540,"id_str":"2541852540","name":"GoSudoApp","screen_name":"GoSudoApp","location":"Rochester, NY","url":"http:\/\/www.gosudo.com\/download","description":"Save time, save money, live the life you love! Before you go out... goSudo! APP NOW AVAILABLE for iPhone and Android.","protected":false,"verified":false,"followers_count":215,"friends_count":833,"listed_count":0,"favourites_count":43,"statuses_count":217,"created_at":"Mon Jun 02 17:20:22 +0000 2
 014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/520238316575137792\/JspkdECa_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/520238316575137792\/JspkdECa_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2541852540\/1413470582","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"
 place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"frugal","indices":[4,11]},{"text":"BlackFriday","indices":[48,60]},{"text":"deals","indices":[82,88]},{"text":"coupons","indices":[93,101]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/zv8wsr2xMv","expanded_url":"http:\/\/ow.ly\/EOf7t","display_url":"ow.ly\/EOf7t","indices":[118,140]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853108349"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946972947906560,"id_str":"536946972947906560","text":"@Kohls #BlackFriday #KohlsSweeps  #OneDirection won!!!!","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":568670986,"id_str":"568670986","name":"FitFunFreebieSeeker","screen_name":"ddburks22","location":"Let's Win Together USA","url":"http:\/\/fitnfunfreebieseekers22.blogspot.com\/","description":"Freebies Galore and so much more!!!!","protected":false,"verified":false,"followers_count":292,"friends_count":2002,"listed_count":4,"favourites_count":247,"statuses_count":3182,"created_at":"Wed May 02 00:45:38 +0000 2012","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":fa
 lse,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"F218CA","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/481898416369172480\/2XaBqRtI_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/481898416369172480\/2XaBqRtI_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/568670986\/1403883845","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","in
 dices":[7,19]},{"text":"KohlsSweeps","indices":[20,32]},{"text":"OneDirection","indices":[34,47]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"und","timestamp_ms":"1416853109000"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973048569859,"id_str":"536946973048569859","text":"Kohl's #BlackFriday Deals are online right now! Get $15 for every $50 spent, see how now!  http:\/\/t.co\/7gQvYWkc5b http:\/\/t.co\/hRY8WutNmX","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":41407443,"id_str":"41407443","name":"Cyber Monday","screen_name":"cybermonday_fm","location":"","url":"http:\/\/www.cybermonday.fm\/","description":"Cyber Monday 2014 Date: 12\/1\/2014. You can also find us here: http:\/\/www.facebook.com\/cybermondayfm","protected":false,"verified":false,"followers_count":11331,"friends_count":14,"listed_count":339,"favourites_count":1,"statuses_count":815,"created_at":"Wed May 20 17:43:47 +0000 2009","utc_offset":-288
 00,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"B4DCEA","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/170548826\/CM_background.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/170548826\/CM_background.jpg","profile_background_tile":false,"profile_link_color":"0076A1","profile_sidebar_border_color":"D7F1FA","profile_sidebar_fill_color":"B4DCEA","profile_text_color":"212121","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1164802364\/twitter_profile_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1164802364\/twitter_profile_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"re
 tweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[7,19]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/7gQvYWkc5b","expanded_url":"http:\/\/bit.ly\/1AIdYdF","display_url":"bit.ly\/1AIdYdF","indices":[91,113]}],"user_mentions":[],"symbols":[],"media":[{"id":536946972457185280,"id_str":"536946972457185280","indices":[114,136],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","url":"http:\/\/t.co\/hRY8WutNmX","display_url":"pic.twitter.com\/hRY8WutNmX","expanded_url":"http:\/\/twitter.com\/cybermonday_fm\/status\/536946973048569859\/photo\/1","type":"photo","sizes":{"small":{"w":340,"h":167,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":600,"h":295,"resize":"fit"},"medium":{"w":600,"h":295,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536946972457185280,"id_str":"536946972457185280","indices":[114,136],"media_url":"http:\/\/pbs.
 twimg.com\/media\/B3OebTSIMAAgkVg.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","url":"http:\/\/t.co\/hRY8WutNmX","display_url":"pic.twitter.com\/hRY8WutNmX","expanded_url":"http:\/\/twitter.com\/cybermonday_fm\/status\/536946973048569859\/photo\/1","type":"photo","sizes":{"small":{"w":340,"h":167,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":600,"h":295,"resize":"fit"},"medium":{"w":600,"h":295,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853109024"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973681537024,"id_str":"536946973681537024","text":"#blackfriday #amazon Black Friday Will Boost November Car Sales, Forecasts Ed... http:\/\/t.co\/JXtqfEP3zI http:\/\/t.co\/wMLNnGGWWv","source":"\u003ca href=\"http:\/\/twitterfeed.com\" rel=\"nofollow\"\u003etwitterfeed\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":772793874,"id_str":"772793874","name":"Discount Apparel","screen_name":"ApparelDiscount","location":"","url":null,"description":"Searching the web to give you the best, most current information to help you to find discounts and save money with your apparel buying needs.","protected":false,"verified":false,"followers_count":449,"friends_count":593,"listed_count":13,"favourites_count":0,"statuses_count":17187,"created_at":"Wed Aug 22 03:30:49 +0000 2012","utc_offset":
 -18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2545339161\/zft3lpqptr2klm2a08sh_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2545339161\/zft3lpqptr2klm2a08sh_normal.jpeg","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"
 entities":{"hashtags":[{"text":"blackfriday","indices":[0,12]},{"text":"amazon","indices":[13,20]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/JXtqfEP3zI","expanded_url":"http:\/\/binged.it\/1xtTnDO","display_url":"binged.it\/1xtTnDO","indices":[81,103]},{"url":"http:\/\/t.co\/wMLNnGGWWv","expanded_url":"http:\/\/bit.ly\/1b51a0N","display_url":"bit.ly\/1b51a0N","indices":[104,126]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853109175"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973920997377,"id_str":"536946973920997377","text":"O que dizer da Black Friday, que mal chegou e eu j\u00e1 curto pakas! #BlackFriday #BlackFriday2014","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":104140328,"id_str":"104140328","name":"Aline Terra","screen_name":"liineterra","location":"","url":null,"description":"Dont do it!","protected":false,"verified":false,"followers_count":86,"friends_count":106,"listed_count":0,"favourites_count":40,"statuses_count":398,"created_at":"Tue Jan 12 11:46:35 +0000 2010","utc_offset":-7200,"time_zone":"Brasilia","geo_enabled":true,"lang":"pt","contributors_enabled":false,"is_translator":false,"profile_background_color":"9499A8","profile_background_image_
 url":"http:\/\/pbs.twimg.com\/profile_background_images\/202163013\/BG03.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/202163013\/BG03.jpg","profile_background_tile":true,"profile_link_color":"C40808","profile_sidebar_border_color":"AFB7C7","profile_sidebar_fill_color":"F5F525","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/536375888544555009\/Lz_o6Gv3_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/536375888544555009\/Lz_o6Gv3_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/104140328\/1416705833","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[65,77]},{"text":"BlackFrid
 ay2014","indices":[78,94]}],"trends":[],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"pt","timestamp_ms":"1416853109232"}
+{"created_at":"Mon Nov 24 18:18:34 +0000 2014","id":536946996368920576,"id_str":"536946996368920576","text":"@ao all done!  The Philips one would be my choice #BlackFriday","source":"\u003ca href=\"http:\/\/twitter.com\/download\/android\" rel=\"nofollow\"\u003eTwitter for Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":536918368075677697,"in_reply_to_status_id_str":"536918368075677697","in_reply_to_user_id":49659346,"in_reply_to_user_id_str":"49659346","in_reply_to_screen_name":"ao","user":{"id":222107264,"id_str":"222107264","name":"Jenna Keller","screen_name":"yummymummy299","location":"Bristol, UK","url":null,"description":"Busy mummy of two, a bookworm (who doesn't get time to read books anymore!) and online shopaholic who is obsessed with pretty fabrics :-)","protected":false,"verified":false,"followers_count":947,"friends_count":2000,"listed_count":15,"favourites_count":16755,"statuses_count":40960,"created_at":"Thu Dec 02 13:47:39 +0000 2010","utc_offset":n
 ull,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/523938666729984000\/na3rpNTe_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/523938666729984000\/na3rpNTe_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/222107264\/1415130102","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contr
 ibutors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[50,62]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"ao","name":"ao.com","id":49659346,"id_str":"49659346","indices":[0,3]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853114584"}
+{"created_at":"Mon Nov 24 18:18:35 +0000 2014","id":536946998222397440,"id_str":"536946998222397440","text":"RT @EliteXpression1: Our #blackfriday and #cybermonday already started check it out!  http:\/\/t.co\/VIB5u5a7yj #blackfridayonline #mancave ht\u2026","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":66911145,"id_str":"66911145","name":"Laura Hallowell","screen_name":"lolly7777","location":"Portland, Texas","url":null,"description":"Wife, mom, grandmom looking for things to do now that the kids are in grown!","protected":false,"verified":false,"followers_count":82,"friends_count":180,"listed_count":1,"favourites_count":10,"statuses_count":3233,"created_at":"Wed Aug 19 04:36:19 +0000 2009","utc_offset":-21600,"time_zone":"Cent
 ral Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EDECE9","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme3\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme3\/bg.gif","profile_background_tile":false,"profile_link_color":"088253","profile_sidebar_border_color":"D3D2CF","profile_sidebar_fill_color":"E3E2DE","profile_text_color":"634047","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2771027311\/5db7ca5f2a5b88ce14d4f7b966baf55f_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2771027311\/5db7ca5f2a5b88ce14d4f7b966baf55f_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon 
 Nov 24 16:59:12 +0000 2014","id":536927020761247744,"id_str":"536927020761247744","text":"Our #blackfriday and #cybermonday already started check it out!  http:\/\/t.co\/VIB5u5a7yj #blackfridayonline #mancave http:\/\/t.co\/j4ZcFWAgQp","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":504868506,"id_str":"504868506","name":"Elite Garage Floors","screen_name":"EliteXpression1","location":"Corpus Christi, TX","url":"http:\/\/www.elitegaragefloors.com","description":"Elite Xpressions LLC, is a small family owned business. We have everything to serve your residential garage or commercial floor needs!","protected":false,"verified":false,"followers_count":445,"friends_count":1280,"listed_count":5,"favourites_count":50,"statuses_count":288,"created_at":"Sun 
 Feb 26 19:07:37 +0000 2012","utc_offset":-14400,"time_zone":"Atlantic Time (Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000179098474\/Wg6dGmDL.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000179098474\/Wg6dGmDL.jpeg","profile_background_tile":true,"profile_link_color":"3B94D9","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/525020747652005888\/EWPTJPZe_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/525020747652005888\/EWPTJPZe_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/504868506\/1414009583","default_profile":false,"default_profile_imag
 e":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"blackfriday","indices":[4,16]},{"text":"cybermonday","indices":[21,33]},{"text":"blackfridayonline","indices":[88,106]},{"text":"mancave","indices":[107,115]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/VIB5u5a7yj","expanded_url":"http:\/\/elitearagefloors.com","display_url":"elitearagefloors.com","indices":[65,87]}],"user_mentions":[],"symbols":[],"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[116,138],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":
 699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[116,138],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"blackfriday","indices":[25,37]},{"text":"cybermonday","indices":[42,54]},
 {"text":"blackfridayonline","indices":[109,127]},{"text":"mancave","indices":[128,136]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/VIB5u5a7yj","expanded_url":"http:\/\/elitearagefloors.com","display_url":"elitearagefloors.com","indices":[86,108]}],"user_mentions":[{"screen_name":"EliteXpression1","name":"Elite Garage Floors","id":504868506,"id_str":"504868506","indices":[3,19]}],"symbols":[],"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[139,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}},"source_status_id
 ":536927020761247744,"source_status_id_str":"536927020761247744"}]},"extended_entities":{"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[139,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}},"source_status_id":536927020761247744,"source_status_id_str":"536927020761247744"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853115026"}
+{"created_at":"Mon Nov 24 18:18:37 +0000 2014","id":536947010583031808,"id_str":"536947010583031808","text":"Check out our early bird and #BlackFriday specials: http:\/\/t.co\/NQ9N6OTIpK. They include #pipettes, balances, and.... http:\/\/t.co\/V3JBZnG3yJ","source":"\u003ca href=\"https:\/\/about.twitter.com\/products\/tweetdeck\" rel=\"nofollow\"\u003eTweetDeck\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":356973604,"id_str":"356973604","name":"Pipette.com","screen_name":"PipetteCom","location":"San Diego, California","url":"http:\/\/www.pipette.com","description":"20+ Brands of Pipettes | 10+ Brands of Tips | Lab Equipment | ISO17025 Calibration Service | #PipetteEnthusiast | Follow us for science news, promos, & contests","protected":false,"verified":false,"followers_count":338,"friends_count":435,"listed_count":7,"favourites_coun
 t":4363,"statuses_count":6815,"created_at":"Wed Aug 17 17:06:35 +0000 2011","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_link_color":"0055A5","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/461551352837967872\/PUYn61sm_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/461551352837967872\/PUYn61sm_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/356973604\/1398981361","default_profile":false,"default_profile_image":fals
 e,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[29,41]},{"text":"pipettes","indices":[89,98]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/NQ9N6OTIpK","expanded_url":"http:\/\/bit.ly\/1r2Ueyt","display_url":"bit.ly\/1r2Ueyt","indices":[52,74]}],"user_mentions":[],"symbols":[],"media":[{"id":536946776683450368,"id_str":"536946776683450368","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","url":"http:\/\/t.co\/V3JBZnG3yJ","display_url":"pic.twitter.com\/V3JBZnG3yJ","expanded_url":"http:\/\/twitter.com\/PipetteCom\/status\/536947010583031808\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":264,"resize":"fit"},"large":{"w":677,"h":299,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":
 {"w":340,"h":150,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536946776683450368,"id_str":"536946776683450368","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","url":"http:\/\/t.co\/V3JBZnG3yJ","display_url":"pic.twitter.com\/V3JBZnG3yJ","expanded_url":"http:\/\/twitter.com\/PipetteCom\/status\/536947010583031808\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":264,"resize":"fit"},"large":{"w":677,"h":299,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":150,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853117973"}
+{"created_at":"Mon Nov 24 18:18:39 +0000 2014","id":536947017600073729,"id_str":"536947017600073729","text":"why wait for #BlackFriday Everything 20% off all week #sales where else can you get a pergola for this price #walpolewoodworkers","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2350353498,"id_str":"2350353498","name":"PROPONDS WEST","screen_name":"Proponds_West","location":"Sun Valley, CA","url":"http:\/\/propondsoutlet.com","description":"California's #1 Aquascape and Walpole Outdoors Distributor","protected":false,"verified":false,"followers_count":113,"friends_count":252,"listed_count":1,"favourites_count":57,"statuses_count":292,"created_at":"Tue Feb 18 16:26:28 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"
 en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/435828532455829506\/btS7enIc.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/435828532455829506\/btS7enIc.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532339899253673985\/ONse7lI9_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532339899253673985\/ONse7lI9_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2350353498\/1394640550","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place
 ":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[13,25]},{"text":"sales","indices":[54,60]},{"text":"walpolewoodworkers","indices":[109,128]}],"trends":[],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853119646"}
+{"created_at":"Mon Nov 24 18:18:39 +0000 2014","id":536947018858381312,"id_str":"536947018858381312","text":"RT @firewallman: Cyber Monday Angebote on Amazon http:\/\/t.co\/UjZLAKWVHl #CyberMonday #paperli #BlackFriday @amazon","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2874369083,"id_str":"2874369083","name":"dioseli","screen_name":"dioswillyrex1","location":"asdg","url":null,"description":"njscnzs","protected":false,"verified":false,"followers_count":42,"friends_count":0,"listed_count":0,"favourites_count":189,"statuses_count":378,"created_at":"Wed Nov 12 22:31:38 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"es","contributors_enabled":false,"is_translator":false,"profile_background_color":"0000
 00","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"94D487","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532671809523417088\/7bKmbNWd_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532671809523417088\/7bKmbNWd_normal.png","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon Nov 24 14:38:48 +0000 2014","id":536891690200883200,"id_str":"536891690200883200","text":"Cyber Monday Angebote on Amazon http:\/\/t.co\/UjZLAKWVHl #CyberMonday #paperli #
 BlackFriday @amazon","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":19294316,"id_str":"19294316","name":"Igor Adolph","screen_name":"firewallman","location":"Germany","url":"http:\/\/de.favstar.fm\/users\/firewallman","description":"Fan of #postcards #comics #music #musik #fashion","protected":false,"verified":false,"followers_count":4949,"friends_count":4548,"listed_count":31,"favourites_count":1608,"statuses_count":9168,"created_at":"Wed Jan 21 16:31:39 +0000 2009","utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"C6E2EE","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme2\/bg.gif","profile_background_image_url_https":"ht
 tps:\/\/abs.twimg.com\/images\/themes\/theme2\/bg.gif","profile_background_tile":false,"profile_link_color":"1F98C7","profile_sidebar_border_color":"C6E2EE","profile_sidebar_fill_color":"DAECF4","profile_text_color":"663B12","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2444928975\/okma6mavb4i0rhd5i7nt_normal.gif","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2444928975\/okma6mavb4i0rhd5i7nt_normal.gif","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/19294316\/1399652447","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":11,"favorite_count":36,"entities":{"hashtags":[{"text":"CyberMonday","indices":[55,67]},{"text":"paperli","indices":[68,76]},{"text":"BlackFriday","indices":[77,89]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UjZLAKWVHl","expanded_
 url":"http:\/\/amzn.to\/1pf9UgU","display_url":"amzn.to\/1pf9UgU","indices":[32,54]}],"user_mentions":[{"screen_name":"amazon","name":"Amazon","id":20793816,"id_str":"20793816","indices":[90,97]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"CyberMonday","indices":[72,84]},{"text":"paperli","indices":[85,93]},{"text":"BlackFriday","indices":[94,106]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UjZLAKWVHl","expanded_url":"http:\/\/amzn.to\/1pf9UgU","display_url":"amzn.to\/1pf9UgU","indices":[49,71]}],"user_mentions":[{"screen_name":"firewallman","name":"Igor Adolph","id":19294316,"id_str":"19294316","indices":[3,15]},{"screen_name":"amazon","name":"Amazon","id":20793816,"id_str":"20793816","indices":[107,114]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"141685311994
 6"}
+{"created_at":"Mon Nov 24 18:18:40 +0000 2014","id":536947020888408064,"id_str":"536947020888408064","text":"Be sure to make @RHTruckfitters one of your Black Friday destinations! #BlackFriday #RanchHand #HolidayShopping http:\/\/t.co\/tmHc0qCEYP","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2303382438,"id_str":"2303382438","name":"Truckfitters","screen_name":"RHTruckfitters","location":"8 Locations","url":"http:\/\/www.truckfitters.com","description":"Ranch Hand Truckfitters is the #1 Source for Truck Accessories selling all the brands you know & trust. 8 stores in the US! http:\/\/Truckfitters.com","protected":false,"verified":false,"followers_count":74,"friends_count":122,"listed_count":0,"favourites_count":11,"statuses_count":61,"created_at"
 :"Tue Jan 21 16:52:03 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_link_color":"C26A1D","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/425679272850624513\/BMnZxIKX_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/425679272850624513\/BMnZxIKX_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2303382438\/1390325155","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},
 "geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[71,83]},{"text":"RanchHand","indices":[84,94]},{"text":"HolidayShopping","indices":[95,111]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"RHTruckfitters","name":"Truckfitters","id":2303382438,"id_str":"2303382438","indices":[16,31]}],"symbols":[],"media":[{"id":536947019365879808,"id_str":"536947019365879808","indices":[112,134],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","url":"http:\/\/t.co\/tmHc0qCEYP","display_url":"pic.twitter.com\/tmHc0qCEYP","expanded_url":"http:\/\/twitter.com\/RHTruckfitters\/status\/536947020888408064\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":776,"resize":"fit"},"large":{"w":1024,"h":1325,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":440,"resize":"fit"}
 }}]},"extended_entities":{"media":[{"id":536947019365879808,"id_str":"536947019365879808","indices":[112,134],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","url":"http:\/\/t.co\/tmHc0qCEYP","display_url":"pic.twitter.com\/tmHc0qCEYP","expanded_url":"http:\/\/twitter.com\/RHTruckfitters\/status\/536947020888408064\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":776,"resize":"fit"},"large":{"w":1024,"h":1325,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":440,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853120430"}
+{"created_at":"Mon Nov 24 18:18:43 +0000 2014","id":536947032024702976,"id_str":"536947032024702976","text":"http:\/\/t.co\/UOKhHuOKsB #BlackFriday #EPIPHONE LES PAUL STANDARD EBONY\/Bigsby B7\/Updated Pickups\/Roller Bridge\/Grovers http:\/\/t.co\/3g96WS2rri","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238946,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang
 ":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_co
 unt":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]},{"text":"EPIPHONE","indices":[36,45]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UOKhHuOKsB","expanded_url":"http:\/\/ift.tt\/1r2XOZA","display_url":"ift.tt\/1r2XOZA","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947031991152641,"id_str":"536947031991152641","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","url":"http:\/\/t.co\/3g96WS2rri","display_url":"pic.twitter.com\/3g96WS2rri","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947032024702976\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947031991152641,"id_str":"536947031991152641","indices":[118,140],"media_url":"http:\
 /\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","url":"http:\/\/t.co\/3g96WS2rri","display_url":"pic.twitter.com\/3g96WS2rri","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947032024702976\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853123085"}
+{"created_at":"Mon Nov 24 18:18:43 +0000 2014","id":536947035627614208,"id_str":"536947035627614208","text":"@Kohls One Direction #BlackFriday #KohlsSweeps","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":34732438,"id_str":"34732438","name":"Jennifer MacArthur","screen_name":"LuckyJenx","location":"","url":null,"description":null,"protected":false,"verified":false,"followers_count":130,"friends_count":673,"listed_count":0,"favourites_count":6,"statuses_count":397,"created_at":"Thu Apr 23 21:18:22 +0000 2009","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"709397","profile_background_image_url":"http:\/\/abs.twimg.
 com\/images\/themes\/theme6\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme6\/bg.gif","profile_background_tile":false,"profile_link_color":"FF3300","profile_sidebar_border_color":"86A4A6","profile_sidebar_fill_color":"A0C5C7","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/472769626602864641\/CEGX3CSE_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/472769626602864641\/CEGX3CSE_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/34732438\/1392406660","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[21,33]},{"text":"KohlsSweeps","indices":[34,46]}],"trends":[],"urls":[],"user_menti
 ons":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853123944"}
+{"created_at":"Mon Nov 24 18:18:45 +0000 2014","id":536947042359463937,"id_str":"536947042359463937","text":"http:\/\/t.co\/GVBKu5NAfk #BlackFriday #2000 Ibanez RG7621 Japanese 7-String Hard Tail Guitar Dimarzio Made Pickups http:\/\/t.co\/ODduwZcSct","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238947,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","c
 ontributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"e
 ntities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/GVBKu5NAfk","expanded_url":"http:\/\/ift.tt\/1r2XPN4","display_url":"ift.tt\/1r2XPN4","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947042300743680,"id_str":"536947042300743680","indices":[113,135],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","url":"http:\/\/t.co\/ODduwZcSct","display_url":"pic.twitter.com\/ODduwZcSct","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947042359463937\/photo\/1","type":"photo","sizes":{"large":{"w":93,"h":140,"resize":"fit"},"thumb":{"w":93,"h":140,"resize":"crop"},"small":{"w":93,"h":140,"resize":"fit"},"medium":{"w":93,"h":140,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947042300743680,"id_str":"536947042300743680","indices":[113,135],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","medi
 a_url_https":"https:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","url":"http:\/\/t.co\/ODduwZcSct","display_url":"pic.twitter.com\/ODduwZcSct","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947042359463937\/photo\/1","type":"photo","sizes":{"large":{"w":93,"h":140,"resize":"fit"},"thumb":{"w":93,"h":140,"resize":"crop"},"small":{"w":93,"h":140,"resize":"fit"},"medium":{"w":93,"h":140,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"in","timestamp_ms":"1416853125549"}
+{"created_at":"Mon Nov 24 18:18:46 +0000 2014","id":536947044452012032,"id_str":"536947044452012032","text":"Do #BlackFriday with us! Get all the savings and none of the shoving! Visit: http:\/\/t.co\/jklPRkY8Ix http:\/\/t.co\/be39JseIP6","source":"\u003ca href=\"http:\/\/sproutsocial.com\" rel=\"nofollow\"\u003eSprout Social\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":137174096,"id_str":"137174096","name":"Puklich Chevrolet ","screen_name":"PuklichChevy","location":"3701 State Street Bismarck, ND","url":"http:\/\/www.puklich-chevrolet.com\/","description":"Puklich Chevrolet is your complete new Chevrolet dealer serving Bismarck\/Mandan. We have a large inventory of new and pre-owned Chevy vehicles.","protected":false,"verified":false,"followers_count":795,"friends_count":489,"listed_count":61,"favourites_count":12,"statuses_count"
 :7468,"created_at":"Mon Apr 26 01:20:44 +0000 2010","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"92BCD1","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000178949491\/nS0NKRpj.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000178949491\/nS0NKRpj.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/436228685457145856\/KjSv7Pui_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/436228685457145856\/KjSv7Pui_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/137174096\/1402524098","default_profile"
 :false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[3,15]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/jklPRkY8Ix","expanded_url":"http:\/\/bit.ly\/1zllYgP","display_url":"bit.ly\/1zllYgP","indices":[77,99]}],"user_mentions":[],"symbols":[],"media":[{"id":536947044380708866,"id_str":"536947044380708866","indices":[100,122],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","url":"http:\/\/t.co\/be39JseIP6","display_url":"pic.twitter.com\/be39JseIP6","expanded_url":"http:\/\/twitter.com\/PuklichChevy\/status\/536947044452012032\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":512,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":300,"resize":"fit"},"small":{
 "w":340,"h":170,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947044380708866,"id_str":"536947044380708866","indices":[100,122],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","url":"http:\/\/t.co\/be39JseIP6","display_url":"pic.twitter.com\/be39JseIP6","expanded_url":"http:\/\/twitter.com\/PuklichChevy\/status\/536947044452012032\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":512,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":300,"resize":"fit"},"small":{"w":340,"h":170,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853126048"}
+{"created_at":"Mon Nov 24 18:18:47 +0000 2014","id":536947052534448128,"id_str":"536947052534448128","text":"Enter for your shot at $10,000 and 100 Instant Win daily prizes from @Coupons #BlackFriday #Giveaway http:\/\/t.co\/8gSmhrQ0JA","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":67502035,"id_str":"67502035","name":"ivelisse woods","screen_name":"ivel1977","location":"utica, ny ","url":null,"description":null,"protected":false,"verified":false,"followers_count":73,"friends_count":1949,"listed_count":1,"favourites_count":2,"statuses_count":2620,"created_at":"Fri Aug 21 02:43:38 +0000 2009","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_co
 lor":"9AE4E8","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme16\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme16\/bg.gif","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"BDDCAD","profile_sidebar_fill_color":"DDFFCC","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1872198615\/628070142Portrait-of-Alfred-Stieglitz-Man-Ray-1913_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1872198615\/628070142Portrait-of-Alfred-Stieglitz-Man-Ray-1913_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[78,90]},{"text":"Giveaway","indices"
 :[91,100]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/8gSmhrQ0JA","expanded_url":"http:\/\/shout.lt\/K1wc","display_url":"shout.lt\/K1wc","indices":[101,123]}],"user_mentions":[{"screen_name":"Coupons","name":"Coupons.com","id":1451811,"id_str":"1451811","indices":[69,77]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853127975"}
+{"created_at":"Mon Nov 24 18:18:48 +0000 2014","id":536947053507919873,"id_str":"536947053507919873","text":"http:\/\/t.co\/Y9kH11COtM #BlackFriday #Peavey Raptor EXP Black Electric Guitar http:\/\/t.co\/WkgPMDMdG2","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238948,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_trans
 lator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Black
 Friday","indices":[23,35]},{"text":"Peavey","indices":[36,43]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/Y9kH11COtM","expanded_url":"http:\/\/ift.tt\/1r2XQk9","display_url":"ift.tt\/1r2XQk9","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947053465972737,"id_str":"536947053465972737","indices":[77,99],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","url":"http:\/\/t.co\/WkgPMDMdG2","display_url":"pic.twitter.com\/WkgPMDMdG2","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947053507919873\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947053465972737,"id_str":"536947053465972737","indices":[77,99],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","medi
 a_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","url":"http:\/\/t.co\/WkgPMDMdG2","display_url":"pic.twitter.com\/WkgPMDMdG2","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947053507919873\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853128207"}
+{"created_at":"Mon Nov 24 18:18:49 +0000 2014","id":536947057182134272,"id_str":"536947057182134272","text":"A look at the best deals for gamers this #BlackFriday from @gamespot  http:\/\/t.co\/BaoLzjGa7a","source":"\u003ca href=\"https:\/\/about.twitter.com\/products\/tweetdeck\" rel=\"nofollow\"\u003eTweetDeck\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2891286782,"id_str":"2891286782","name":"Girls Can Game","screen_name":"girlscan_game","location":"NYC","url":"http:\/\/bit.ly\/GirlsCanGame","description":"Bridging the video game gap. Online publication focused on gaming, women, culture, community and everything that overlaps.","protected":false,"verified":false,"followers_count":54,"friends_count":393,"listed_count":1,"favourites_count":0,"statuses_count":31,"created_at":"Wed Nov 05 23:41:05 +0000 2014","utc_offset":null,"time_
 zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"3B94D9","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532053556061163521\/2YVOmA4m_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532053556061163521\/2YVOmA4m_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday
 ","indices":[41,53]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/BaoLzjGa7a","expanded_url":"http:\/\/bit.ly\/BlackFridayGaming","display_url":"bit.ly\/BlackFridayGam\u2026","indices":[70,92]}],"user_mentions":[{"screen_name":"gamespot","name":"GameSpot","id":7157132,"id_str":"7157132","indices":[59,68]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853129083"}
+{"created_at":"Mon Nov 24 18:18:49 +0000 2014","id":536947059883257856,"id_str":"536947059883257856","text":"http:\/\/t.co\/ZmFFgc9EDJ #BlackFriday #2000 Ibanez RG7621 Japanese 7-String Hard Tail Guitar-Dimarzio Pickup-Hard Case http:\/\/t.co\/4OSUTkMHUX","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238949,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en
 ","contributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":
 0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/ZmFFgc9EDJ","expanded_url":"http:\/\/ift.tt\/11PGPNZ","display_url":"ift.tt\/11PGPNZ","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947059732254720,"id_str":"536947059732254720","indices":[117,139],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","url":"http:\/\/t.co\/4OSUTkMHUX","display_url":"pic.twitter.com\/4OSUTkMHUX","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947059883257856\/photo\/1","type":"photo","sizes":{"large":{"w":140,"h":93,"resize":"fit"},"medium":{"w":140,"h":93,"resize":"fit"},"thumb":{"w":140,"h":93,"resize":"crop"},"small":{"w":140,"h":93,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947059732254720,"id_str":"536947059732254720","indices":[117,139],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","
 media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","url":"http:\/\/t.co\/4OSUTkMHUX","display_url":"pic.twitter.com\/4OSUTkMHUX","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947059883257856\/photo\/1","type":"photo","sizes":{"large":{"w":140,"h":93,"resize":"fit"},"medium":{"w":140,"h":93,"resize":"fit"},"thumb":{"w":140,"h":93,"resize":"crop"},"small":{"w":140,"h":93,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853129727"}
+{"created_at":"Mon Nov 24 18:18:51 +0000 2014","id":536947066699022336,"id_str":"536947066699022336","text":"http:\/\/t.co\/Sqk0Jny4AT #BlackFriday #ESP Eclipse II http:\/\/t.co\/WyCGj7exkU","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238950,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_bac
 kground_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]
 },{"text":"ESP","indices":[36,40]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/Sqk0Jny4AT","expanded_url":"http:\/\/ift.tt\/11PGQ4w","display_url":"ift.tt\/11PGQ4w","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947066661273600,"id_str":"536947066661273600","indices":[52,74],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","url":"http:\/\/t.co\/WyCGj7exkU","display_url":"pic.twitter.com\/WyCGj7exkU","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947066699022336\/photo\/1","type":"photo","sizes":{"large":{"w":133,"h":140,"resize":"fit"},"medium":{"w":133,"h":140,"resize":"fit"},"thumb":{"w":133,"h":140,"resize":"crop"},"small":{"w":133,"h":140,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947066661273600,"id_str":"536947066661273600","indices":[52,74],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","media_url_https":"https:\/\/pbs.
 twimg.com\/media\/B3OegyOIgAAwug3.jpg","url":"http:\/\/t.co\/WyCGj7exkU","display_url":"pic.twitter.com\/WyCGj7exkU","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947066699022336\/photo\/1","type":"photo","sizes":{"large":{"w":133,"h":140,"resize":"fit"},"medium":{"w":133,"h":140,"resize":"fit"},"thumb":{"w":133,"h":140,"resize":"crop"},"small":{"w":133,"h":140,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"ro","timestamp_ms":"1416853131352"}
+{"created_at":"Mon Nov 24 18:18:52 +0000 2014","id":536947072738811904,"id_str":"536947072738811904","text":"@Kohls One Direction #BlackFriday #KohlsSweeps","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":536897286534471682,"in_reply_to_status_id_str":"536897286534471682","in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":2362883828,"id_str":"2362883828","name":"Cori Nelson","screen_name":"nelsontch5","location":"","url":null,"description":"5th grade teacher","protected":false,"verified":false,"followers_count":273,"friends_count":660,"listed_count":1,"favourites_count":113,"statuses_count":138,"created_at":"Wed Feb 26 16:06:26 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_backg
 round_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/440123708502331394\/FV3yjCcf_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/440123708502331394\/FV3yjCcf_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2362883828\/1394569130","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[21,33]},{"text":"KohlsSweeps","indices":[34,4
 6]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853132792"}
+{"created_at":"Mon Nov 24 18:18:52 +0000 2014","id":536947073401491456,"id_str":"536947073401491456","text":"http:\/\/t.co\/AtKRJzVHDU #BlackFriday #IBANEZ GIO GRX40 ELECTRIC GUITAR BLACK NICE!!!! http:\/\/t.co\/HeoqrC0QGd","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238951,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"
 is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text
 ":"BlackFriday","indices":[23,35]},{"text":"IBANEZ","indices":[36,43]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/AtKRJzVHDU","expanded_url":"http:\/\/ift.tt\/11PGT0a","display_url":"ift.tt\/11PGT0a","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947073179201536,"id_str":"536947073179201536","indices":[85,107],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","url":"http:\/\/t.co\/HeoqrC0QGd","display_url":"pic.twitter.com\/HeoqrC0QGd","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947073401491456\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947073179201536,"id_str":"536947073179201536","indices":[85,107],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.
 jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","url":"http:\/\/t.co\/HeoqrC0QGd","display_url":"pic.twitter.com\/HeoqrC0QGd","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947073401491456\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"es","timestamp_ms":"1416853132950"}
+{"created_at":"Mon Nov 24 18:18:53 +0000 2014","id":536947074475233281,"id_str":"536947074475233281","text":"#Mashable's 3 #fitness trackers to look for #BlackFriday! Our sale starts 11\/28! http:\/\/t.co\/5NFIY4KhYJ #Vivofit http:\/\/t.co\/jjqIksmRWI","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":16579129,"id_str":"16579129","name":"GPS City","screen_name":"GPSCity","location":"Calgary & Las Vegas","url":"http:\/\/www.gpscity.com","description":"The Original Online GPS Super Store since 1994! Tweeting about GPS-related news, technology, travel, geocaching, fitness & special offers.","protected":false,"verified":false,"followers_count":1872,"friends_count":621,"listed_count":74,"favourites_count":14,"statuses_count":3055,"created_at":"Fri Oct 03 
 15:30:59 +0000 2008","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/432925828\/twitter2.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/432925828\/twitter2.png","profile_background_tile":false,"profile_link_color":"83838A","profile_sidebar_border_color":"1E1E1E","profile_sidebar_fill_color":"FFCC00","profile_text_color":"58595C","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1490449410\/261176_24852380666_3633199_n_normal.jpg","profile_image_url_https":"https:\/

<TRUNCATED>

[04/11] drill git commit: DRILL-1832: Add unit tests for Json file with null values

Posted by pa...@apache.org.
http://git-wip-us.apache.org/repos/asf/drill/blob/25ea3e83/exec/java-exec/src/test/resources/jsoninput/drill-1832-2-result.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/jsoninput/drill-1832-2-result.json b/exec/java-exec/src/test/resources/jsoninput/drill-1832-2-result.json
new file mode 100644
index 0000000..f070d80
--- /dev/null
+++ b/exec/java-exec/src/test/resources/jsoninput/drill-1832-2-result.json
@@ -0,0 +1 @@
+{"sum_Number_of_Records_ok":43}


[03/11] drill git commit: DRILL-1832: Add unit tests for Json file with null values

Posted by pa...@apache.org.
http://git-wip-us.apache.org/repos/asf/drill/blob/25ea3e83/exec/java-exec/src/test/resources/jsoninput/twitter_43.json
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/resources/jsoninput/twitter_43.json b/exec/java-exec/src/test/resources/jsoninput/twitter_43.json
new file mode 100644
index 0000000..fb57962
--- /dev/null
+++ b/exec/java-exec/src/test/resources/jsoninput/twitter_43.json
@@ -0,0 +1,43 @@
+{"created_at":"Mon Nov 24 18:18:22 +0000 2014","id":536946943952707584,"id_str":"536946943952707584","text":"Ol\u00e1! Pe\u00e7a com Frete Gr\u00e1tis e Parcelamento em at\u00e9 12x SEM juros no cart\u00e3o!! #BlackFriday... http:\/\/t.co\/at01bG91Nj","source":"\u003ca href=\"http:\/\/www.facebook.com\/twitter\" rel=\"nofollow\"\u003eFacebook\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1080585416,"id_str":"1080585416","name":"Bela Elisha ","screen_name":"BelaElisha","location":"Rio de Janeiro","url":"http:\/\/www.belaelisha.com","description":"Loja de Folheados e Bijouterias. Nossos folheados t\u00eam 1 ano de garantia pelo fabricante e bijus finas, semi joias e moda praia. Conhe\u00e7a-nos!","protected":false,"verified":false,"followers_count":29,"friends_count":231,"listed_count":0,"favourites_count":17,"statuses_count":11344,"cr
 eated_at":"Fri Jan 11 18:45:10 +0000 2013","utc_offset":-7200,"time_zone":"Brasilia","geo_enabled":true,"lang":"pt","contributors_enabled":false,"is_translator":false,"profile_background_color":"BF2AB5","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/490205032990527490\/hJZGzgHX.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/490205032990527490\/hJZGzgHX.png","profile_background_tile":false,"profile_link_color":"EBAEEB","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/490205430287577089\/ctKYbfLq_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/490205430287577089\/ctKYbfLq_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/1080585416\/1410206362","default_profile":false,"default_profile_image
 ":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[75,87]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/at01bG91Nj","expanded_url":"http:\/\/fb.me\/6Nx5Rwa8W","display_url":"fb.me\/6Nx5Rwa8W","indices":[91,113]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"pt","timestamp_ms":"1416853102087"}
+{"created_at":"Mon Nov 24 18:18:22 +0000 2014","id":536946944724045825,"id_str":"536946944724045825","text":"http:\/\/t.co\/nTcavbq5Nt #BlackFriday #NEW 41\" CUTAWAY ACOUSTIC ELECTRIC NATURAL  STEEL STRING  GUITAR DE ROSA http:\/\/t.co\/oFbLFJLpWE","source":"\u003ca href=\"http:\/\/twifarm.goodfiles.net\" rel=\"nofollow\"\u003etwifarmtest\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1454645382,"id_str":"1454645382","name":"Yuliana Albasiny","screen_name":"AlbasinyYuliana","location":"Albuquerque","url":null,"description":"All about sex videos","protected":false,"verified":false,"followers_count":15,"friends_count":33,"listed_count":0,"favourites_count":0,"statuses_count":184,"created_at":"Fri May 24 16:38:35 +0000 2013","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":fa
 lse,"profile_background_color":"1A1B1F","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme9\/bg.gif","profile_background_tile":false,"profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/3737792542\/c99b583c1cf476e1b8d6c44d8ef910c4_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/3737792542\/c99b583c1cf476e1b8d6c44d8ef910c4_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]},{"text":"NEW","indices":[36,40]}],"tre
 nds":[],"urls":[{"url":"http:\/\/t.co\/nTcavbq5Nt","expanded_url":"http:\/\/ift.tt\/1yKdcsv","display_url":"ift.tt\/1yKdcsv","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536751006743539713,"id_str":"536751006743539713","indices":[109,131],"media_url":"http:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","url":"http:\/\/t.co\/oFbLFJLpWE","display_url":"pic.twitter.com\/oFbLFJLpWE","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536751006789689344\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}},"source_status_id":536751006789689344,"source_status_id_str":"536751006789689344"}]},"extended_entities":{"media":[{"id":536751006743539713,"id_str":"536751006743539713","indices":[109,131],"media_url":"http:\/\/pbs.twimg.com\/media\/B3LsMmHI
 MAEnQ9y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3LsMmHIMAEnQ9y.jpg","url":"http:\/\/t.co\/oFbLFJLpWE","display_url":"pic.twitter.com\/oFbLFJLpWE","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536751006789689344\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}},"source_status_id":536751006789689344,"source_status_id_str":"536751006789689344"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"tl","timestamp_ms":"1416853102271"}
+{"created_at":"Mon Nov 24 18:18:26 +0000 2014","id":536946961153130496,"id_str":"536946961153130496","text":"RT @Rackspace: Don't miss our blog &amp; hangout about how our customer @bold_apps scales their apps for #BlackFriday &amp; #CyberMonday http:\/\/t.c\u2026","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":258827412,"id_str":"258827412","name":"\u0628\u062d\u0631\u0627\u0646\u064a","screen_name":"bhdba_info","location":"Bahrain","url":"http:\/\/www.oracle.com","description":"IT Manager, Databases Admin and Storage Design and Implementer(EMC),  Design and  Disaster Recovery Sites and Administrator Business Continuity  Solutions.","protected":false,"verified":false,"followers_count":117,"friends_count":411,"listed_count":8,"fa
 vourites_count":719,"statuses_count":3615,"created_at":"Mon Feb 28 15:54:24 +0000 2011","utc_offset":10800,"time_zone":"Kuwait","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/266458250\/OracleBuilding.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/266458250\/OracleBuilding.jpg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1387477954\/Oracle_DBA_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1387477954\/Oracle_DBA_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notificati
 ons":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon Nov 24 15:23:29 +0000 2014","id":536902935154659331,"id_str":"536902935154659331","text":"Don't miss our blog &amp; hangout about how our customer @bold_apps scales their apps for #BlackFriday &amp; #CyberMonday http:\/\/t.co\/tSt0UuASV5","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":26191233,"id_str":"26191233","name":"Rackspace","screen_name":"Rackspace","location":"San Antonio, TX","url":"http:\/\/www.rackspace.com","description":"The managed cloud company. Backed by Fanatical Support\u00ae. Questions? Reach us here: http:\/\/www.rackspace.com\/support","protected":false,"verified":true,"followers_count":79547,"friends_count":2197,"l
 isted_count":2177,"favourites_count":2080,"statuses_count":18396,"created_at":"Tue Mar 24 06:30:52 +0000 2009","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000109624749\/a1281727f93c953444546644f0c226ef.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000109624749\/a1281727f93c953444546644f0c226ef.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2820164575\/0226f9ef1173d90417e5113e25e0cc17_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2820164575\/0226f9ef117
 3d90417e5113e25e0cc17_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/26191233\/1405427913","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":12,"favorite_count":4,"entities":{"hashtags":[{"text":"BlackFriday","indices":[90,102]},{"text":"CyberMonday","indices":[109,121]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/tSt0UuASV5","expanded_url":"http:\/\/bit.ly\/1xTZczm","display_url":"bit.ly\/1xTZczm","indices":[122,144]}],"user_mentions":[{"screen_name":"bold_apps","name":"BOLDapps","id":543563317,"id_str":"543563317","indices":[57,67]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[105,117]},{"text":"CyberMonday","indices":[124,136]}],"trends":[],"urls"
 :[{"url":"http:\/\/t.co\/tSt0UuASV5","expanded_url":"http:\/\/bit.ly\/1xTZczm","display_url":"bit.ly\/1xTZczm","indices":[147,148]}],"user_mentions":[{"screen_name":"Rackspace","name":"Rackspace","id":26191233,"id_str":"26191233","indices":[3,13]},{"screen_name":"bold_apps","name":"BOLDapps","id":543563317,"id_str":"543563317","indices":[72,82]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853106188"}
+{"created_at":"Mon Nov 24 18:18:27 +0000 2014","id":536946966857396224,"id_str":"536946966857396224","text":"http:\/\/t.co\/0WolAvU579\n #isis #Obama #Democrats #BlackFriday #Republicans!","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1560154452,"id_str":"1560154452","name":"Akshay Chauhan","screen_name":"aksh27ay","location":"india","url":"http:\/\/www.latestdeviceinfo.blogspot.com\/","description":"http:\/\/xboxlivecodegenerator.in\/\r\n Put Your Cursor @@@@ Above\r\n\r\n____\u2591F\u2591O\u2591L\u2591L\u2591O\u2591W\u2591\u2591M\u2591E____","protected":false,"verified":false,"followers_count":359,"friends_count":1052,"listed_count":1,"favourites_count":1,"statuses_count":669,"created_at":"Mon Jul 01 10:11:55 +0000 2013","utc_
 offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/420444172240183296\/iw9BC4xd_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/420444172240183296\/iw9BC4xd_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/1560154452\/1389076719","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":nul
 l,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"isis","indices":[24,29]},{"text":"Obama","indices":[30,36]},{"text":"Democrats","indices":[37,47]},{"text":"BlackFriday","indices":[48,60]},{"text":"Republicans","indices":[61,73]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/0WolAvU579","expanded_url":"http:\/\/www.whatisroot.com\/how-to-root-samsung-galaxy-grand-duos\/","display_url":"whatisroot.com\/how-to-root-sa\u2026","indices":[0,22]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"und","timestamp_ms":"1416853107548"}
+{"created_at":"Mon Nov 24 18:18:28 +0000 2014","id":536946970217414656,"id_str":"536946970217414656","text":"Hey #frugal shoppers! Are you getting ready for #BlackFriday? Browse thousands of #deals and #coupons on ONE easy app http:\/\/t.co\/zv8wsr2xMv","source":"\u003ca href=\"http:\/\/www.hootsuite.com\" rel=\"nofollow\"\u003eHootsuite\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2541852540,"id_str":"2541852540","name":"GoSudoApp","screen_name":"GoSudoApp","location":"Rochester, NY","url":"http:\/\/www.gosudo.com\/download","description":"Save time, save money, live the life you love! Before you go out... goSudo! APP NOW AVAILABLE for iPhone and Android.","protected":false,"verified":false,"followers_count":215,"friends_count":833,"listed_count":0,"favourites_count":43,"statuses_count":217,"created_at":"Mon Jun 02 17:20:22 +0000 2
 014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/520238316575137792\/JspkdECa_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/520238316575137792\/JspkdECa_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2541852540\/1413470582","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"
 place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"frugal","indices":[4,11]},{"text":"BlackFriday","indices":[48,60]},{"text":"deals","indices":[82,88]},{"text":"coupons","indices":[93,101]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/zv8wsr2xMv","expanded_url":"http:\/\/ow.ly\/EOf7t","display_url":"ow.ly\/EOf7t","indices":[118,140]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853108349"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946972947906560,"id_str":"536946972947906560","text":"@Kohls #BlackFriday #KohlsSweeps  #OneDirection won!!!!","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":568670986,"id_str":"568670986","name":"FitFunFreebieSeeker","screen_name":"ddburks22","location":"Let's Win Together USA","url":"http:\/\/fitnfunfreebieseekers22.blogspot.com\/","description":"Freebies Galore and so much more!!!!","protected":false,"verified":false,"followers_count":292,"friends_count":2002,"listed_count":4,"favourites_count":247,"statuses_count":3182,"created_at":"Wed May 02 00:45:38 +0000 2012","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":fa
 lse,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"F218CA","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/481898416369172480\/2XaBqRtI_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/481898416369172480\/2XaBqRtI_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/568670986\/1403883845","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","in
 dices":[7,19]},{"text":"KohlsSweeps","indices":[20,32]},{"text":"OneDirection","indices":[34,47]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"und","timestamp_ms":"1416853109000"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973048569859,"id_str":"536946973048569859","text":"Kohl's #BlackFriday Deals are online right now! Get $15 for every $50 spent, see how now!  http:\/\/t.co\/7gQvYWkc5b http:\/\/t.co\/hRY8WutNmX","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":41407443,"id_str":"41407443","name":"Cyber Monday","screen_name":"cybermonday_fm","location":"","url":"http:\/\/www.cybermonday.fm\/","description":"Cyber Monday 2014 Date: 12\/1\/2014. You can also find us here: http:\/\/www.facebook.com\/cybermondayfm","protected":false,"verified":false,"followers_count":11331,"friends_count":14,"listed_count":339,"favourites_count":1,"statuses_count":815,"created_at":"Wed May 20 17:43:47 +0000 2009","utc_offset":-288
 00,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"B4DCEA","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/170548826\/CM_background.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/170548826\/CM_background.jpg","profile_background_tile":false,"profile_link_color":"0076A1","profile_sidebar_border_color":"D7F1FA","profile_sidebar_fill_color":"B4DCEA","profile_text_color":"212121","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1164802364\/twitter_profile_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1164802364\/twitter_profile_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"re
 tweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[7,19]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/7gQvYWkc5b","expanded_url":"http:\/\/bit.ly\/1AIdYdF","display_url":"bit.ly\/1AIdYdF","indices":[91,113]}],"user_mentions":[],"symbols":[],"media":[{"id":536946972457185280,"id_str":"536946972457185280","indices":[114,136],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","url":"http:\/\/t.co\/hRY8WutNmX","display_url":"pic.twitter.com\/hRY8WutNmX","expanded_url":"http:\/\/twitter.com\/cybermonday_fm\/status\/536946973048569859\/photo\/1","type":"photo","sizes":{"small":{"w":340,"h":167,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":600,"h":295,"resize":"fit"},"medium":{"w":600,"h":295,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536946972457185280,"id_str":"536946972457185280","indices":[114,136],"media_url":"http:\/\/pbs.
 twimg.com\/media\/B3OebTSIMAAgkVg.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OebTSIMAAgkVg.jpg","url":"http:\/\/t.co\/hRY8WutNmX","display_url":"pic.twitter.com\/hRY8WutNmX","expanded_url":"http:\/\/twitter.com\/cybermonday_fm\/status\/536946973048569859\/photo\/1","type":"photo","sizes":{"small":{"w":340,"h":167,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"large":{"w":600,"h":295,"resize":"fit"},"medium":{"w":600,"h":295,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853109024"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973681537024,"id_str":"536946973681537024","text":"#blackfriday #amazon Black Friday Will Boost November Car Sales, Forecasts Ed... http:\/\/t.co\/JXtqfEP3zI http:\/\/t.co\/wMLNnGGWWv","source":"\u003ca href=\"http:\/\/twitterfeed.com\" rel=\"nofollow\"\u003etwitterfeed\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":772793874,"id_str":"772793874","name":"Discount Apparel","screen_name":"ApparelDiscount","location":"","url":null,"description":"Searching the web to give you the best, most current information to help you to find discounts and save money with your apparel buying needs.","protected":false,"verified":false,"followers_count":449,"friends_count":593,"listed_count":13,"favourites_count":0,"statuses_count":17187,"created_at":"Wed Aug 22 03:30:49 +0000 2012","utc_offset":
 -18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2545339161\/zft3lpqptr2klm2a08sh_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2545339161\/zft3lpqptr2klm2a08sh_normal.jpeg","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"
 entities":{"hashtags":[{"text":"blackfriday","indices":[0,12]},{"text":"amazon","indices":[13,20]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/JXtqfEP3zI","expanded_url":"http:\/\/binged.it\/1xtTnDO","display_url":"binged.it\/1xtTnDO","indices":[81,103]},{"url":"http:\/\/t.co\/wMLNnGGWWv","expanded_url":"http:\/\/bit.ly\/1b51a0N","display_url":"bit.ly\/1b51a0N","indices":[104,126]}],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853109175"}
+{"created_at":"Mon Nov 24 18:18:29 +0000 2014","id":536946973920997377,"id_str":"536946973920997377","text":"O que dizer da Black Friday, que mal chegou e eu j\u00e1 curto pakas! #BlackFriday #BlackFriday2014","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":104140328,"id_str":"104140328","name":"Aline Terra","screen_name":"liineterra","location":"","url":null,"description":"Dont do it!","protected":false,"verified":false,"followers_count":86,"friends_count":106,"listed_count":0,"favourites_count":40,"statuses_count":398,"created_at":"Tue Jan 12 11:46:35 +0000 2010","utc_offset":-7200,"time_zone":"Brasilia","geo_enabled":true,"lang":"pt","contributors_enabled":false,"is_translator":false,"profile_background_color":"9499A8","profile_background_image_
 url":"http:\/\/pbs.twimg.com\/profile_background_images\/202163013\/BG03.jpg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/202163013\/BG03.jpg","profile_background_tile":true,"profile_link_color":"C40808","profile_sidebar_border_color":"AFB7C7","profile_sidebar_fill_color":"F5F525","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/536375888544555009\/Lz_o6Gv3_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/536375888544555009\/Lz_o6Gv3_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/104140328\/1416705833","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[65,77]},{"text":"BlackFrid
 ay2014","indices":[78,94]}],"trends":[],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"pt","timestamp_ms":"1416853109232"}
+{"created_at":"Mon Nov 24 18:18:34 +0000 2014","id":536946996368920576,"id_str":"536946996368920576","text":"@ao all done!  The Philips one would be my choice #BlackFriday","source":"\u003ca href=\"http:\/\/twitter.com\/download\/android\" rel=\"nofollow\"\u003eTwitter for Android\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":536918368075677697,"in_reply_to_status_id_str":"536918368075677697","in_reply_to_user_id":49659346,"in_reply_to_user_id_str":"49659346","in_reply_to_screen_name":"ao","user":{"id":222107264,"id_str":"222107264","name":"Jenna Keller","screen_name":"yummymummy299","location":"Bristol, UK","url":null,"description":"Busy mummy of two, a bookworm (who doesn't get time to read books anymore!) and online shopaholic who is obsessed with pretty fabrics :-)","protected":false,"verified":false,"followers_count":947,"friends_count":2000,"listed_count":15,"favourites_count":16755,"statuses_count":40960,"created_at":"Thu Dec 02 13:47:39 +0000 2010","utc_offset":n
 ull,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/523938666729984000\/na3rpNTe_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/523938666729984000\/na3rpNTe_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/222107264\/1415130102","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contr
 ibutors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[50,62]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"ao","name":"ao.com","id":49659346,"id_str":"49659346","indices":[0,3]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853114584"}
+{"created_at":"Mon Nov 24 18:18:35 +0000 2014","id":536946998222397440,"id_str":"536946998222397440","text":"RT @EliteXpression1: Our #blackfriday and #cybermonday already started check it out!  http:\/\/t.co\/VIB5u5a7yj #blackfridayonline #mancave ht\u2026","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":66911145,"id_str":"66911145","name":"Laura Hallowell","screen_name":"lolly7777","location":"Portland, Texas","url":null,"description":"Wife, mom, grandmom looking for things to do now that the kids are in grown!","protected":false,"verified":false,"followers_count":82,"friends_count":180,"listed_count":1,"favourites_count":10,"statuses_count":3233,"created_at":"Wed Aug 19 04:36:19 +0000 2009","utc_offset":-21600,"time_zone":"Cent
 ral Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"EDECE9","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme3\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme3\/bg.gif","profile_background_tile":false,"profile_link_color":"088253","profile_sidebar_border_color":"D3D2CF","profile_sidebar_fill_color":"E3E2DE","profile_text_color":"634047","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2771027311\/5db7ca5f2a5b88ce14d4f7b966baf55f_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2771027311\/5db7ca5f2a5b88ce14d4f7b966baf55f_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon 
 Nov 24 16:59:12 +0000 2014","id":536927020761247744,"id_str":"536927020761247744","text":"Our #blackfriday and #cybermonday already started check it out!  http:\/\/t.co\/VIB5u5a7yj #blackfridayonline #mancave http:\/\/t.co\/j4ZcFWAgQp","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":504868506,"id_str":"504868506","name":"Elite Garage Floors","screen_name":"EliteXpression1","location":"Corpus Christi, TX","url":"http:\/\/www.elitegaragefloors.com","description":"Elite Xpressions LLC, is a small family owned business. We have everything to serve your residential garage or commercial floor needs!","protected":false,"verified":false,"followers_count":445,"friends_count":1280,"listed_count":5,"favourites_count":50,"statuses_count":288,"created_at":"Sun 
 Feb 26 19:07:37 +0000 2012","utc_offset":-14400,"time_zone":"Atlantic Time (Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000179098474\/Wg6dGmDL.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000179098474\/Wg6dGmDL.jpeg","profile_background_tile":true,"profile_link_color":"3B94D9","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/525020747652005888\/EWPTJPZe_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/525020747652005888\/EWPTJPZe_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/504868506\/1414009583","default_profile":false,"default_profile_imag
 e":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"blackfriday","indices":[4,16]},{"text":"cybermonday","indices":[21,33]},{"text":"blackfridayonline","indices":[88,106]},{"text":"mancave","indices":[107,115]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/VIB5u5a7yj","expanded_url":"http:\/\/elitearagefloors.com","display_url":"elitearagefloors.com","indices":[65,87]}],"user_mentions":[],"symbols":[],"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[116,138],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":
 699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[116,138],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"blackfriday","indices":[25,37]},{"text":"cybermonday","indices":[42,54]},
 {"text":"blackfridayonline","indices":[109,127]},{"text":"mancave","indices":[128,136]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/VIB5u5a7yj","expanded_url":"http:\/\/elitearagefloors.com","display_url":"elitearagefloors.com","indices":[86,108]}],"user_mentions":[{"screen_name":"EliteXpression1","name":"Elite Garage Floors","id":504868506,"id_str":"504868506","indices":[3,19]}],"symbols":[],"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[139,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}},"source_status_id
 ":536927020761247744,"source_status_id_str":"536927020761247744"}]},"extended_entities":{"media":[{"id":536927019460603905,"id_str":"536927019460603905","indices":[139,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OMR4lCMAE2l7Y.jpg","url":"http:\/\/t.co\/j4ZcFWAgQp","display_url":"pic.twitter.com\/j4ZcFWAgQp","expanded_url":"http:\/\/twitter.com\/EliteXpression1\/status\/536927020761247744\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":699,"resize":"fit"},"small":{"w":340,"h":232,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":410,"resize":"fit"}},"source_status_id":536927020761247744,"source_status_id_str":"536927020761247744"}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853115026"}
+{"created_at":"Mon Nov 24 18:18:37 +0000 2014","id":536947010583031808,"id_str":"536947010583031808","text":"Check out our early bird and #BlackFriday specials: http:\/\/t.co\/NQ9N6OTIpK. They include #pipettes, balances, and.... http:\/\/t.co\/V3JBZnG3yJ","source":"\u003ca href=\"https:\/\/about.twitter.com\/products\/tweetdeck\" rel=\"nofollow\"\u003eTweetDeck\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":356973604,"id_str":"356973604","name":"Pipette.com","screen_name":"PipetteCom","location":"San Diego, California","url":"http:\/\/www.pipette.com","description":"20+ Brands of Pipettes | 10+ Brands of Tips | Lab Equipment | ISO17025 Calibration Service | #PipetteEnthusiast | Follow us for science news, promos, & contests","protected":false,"verified":false,"followers_count":338,"friends_count":435,"listed_count":7,"favourites_coun
 t":4363,"statuses_count":6815,"created_at":"Wed Aug 17 17:06:35 +0000 2011","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_link_color":"0055A5","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/461551352837967872\/PUYn61sm_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/461551352837967872\/PUYn61sm_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/356973604\/1398981361","default_profile":false,"default_profile_image":fals
 e,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[29,41]},{"text":"pipettes","indices":[89,98]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/NQ9N6OTIpK","expanded_url":"http:\/\/bit.ly\/1r2Ueyt","display_url":"bit.ly\/1r2Ueyt","indices":[52,74]}],"user_mentions":[],"symbols":[],"media":[{"id":536946776683450368,"id_str":"536946776683450368","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","url":"http:\/\/t.co\/V3JBZnG3yJ","display_url":"pic.twitter.com\/V3JBZnG3yJ","expanded_url":"http:\/\/twitter.com\/PipetteCom\/status\/536947010583031808\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":264,"resize":"fit"},"large":{"w":677,"h":299,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":
 {"w":340,"h":150,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536946776683450368,"id_str":"536946776683450368","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeP5-CEAAEl9h.jpg","url":"http:\/\/t.co\/V3JBZnG3yJ","display_url":"pic.twitter.com\/V3JBZnG3yJ","expanded_url":"http:\/\/twitter.com\/PipetteCom\/status\/536947010583031808\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":264,"resize":"fit"},"large":{"w":677,"h":299,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":150,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853117973"}
+{"created_at":"Mon Nov 24 18:18:39 +0000 2014","id":536947017600073729,"id_str":"536947017600073729","text":"why wait for #BlackFriday Everything 20% off all week #sales where else can you get a pergola for this price #walpolewoodworkers","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2350353498,"id_str":"2350353498","name":"PROPONDS WEST","screen_name":"Proponds_West","location":"Sun Valley, CA","url":"http:\/\/propondsoutlet.com","description":"California's #1 Aquascape and Walpole Outdoors Distributor","protected":false,"verified":false,"followers_count":113,"friends_count":252,"listed_count":1,"favourites_count":57,"statuses_count":292,"created_at":"Tue Feb 18 16:26:28 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"
 en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/435828532455829506\/btS7enIc.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/435828532455829506\/btS7enIc.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532339899253673985\/ONse7lI9_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532339899253673985\/ONse7lI9_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2350353498\/1394640550","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place
 ":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[13,25]},{"text":"sales","indices":[54,60]},{"text":"walpolewoodworkers","indices":[109,128]}],"trends":[],"urls":[],"user_mentions":[],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853119646"}
+{"created_at":"Mon Nov 24 18:18:39 +0000 2014","id":536947018858381312,"id_str":"536947018858381312","text":"RT @firewallman: Cyber Monday Angebote on Amazon http:\/\/t.co\/UjZLAKWVHl #CyberMonday #paperli #BlackFriday @amazon","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2874369083,"id_str":"2874369083","name":"dioseli","screen_name":"dioswillyrex1","location":"asdg","url":null,"description":"njscnzs","protected":false,"verified":false,"followers_count":42,"friends_count":0,"listed_count":0,"favourites_count":189,"statuses_count":378,"created_at":"Wed Nov 12 22:31:38 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"es","contributors_enabled":false,"is_translator":false,"profile_background_color":"0000
 00","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"94D487","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532671809523417088\/7bKmbNWd_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532671809523417088\/7bKmbNWd_normal.png","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"created_at":"Mon Nov 24 14:38:48 +0000 2014","id":536891690200883200,"id_str":"536891690200883200","text":"Cyber Monday Angebote on Amazon http:\/\/t.co\/UjZLAKWVHl #CyberMonday #paperli #
 BlackFriday @amazon","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":19294316,"id_str":"19294316","name":"Igor Adolph","screen_name":"firewallman","location":"Germany","url":"http:\/\/de.favstar.fm\/users\/firewallman","description":"Fan of #postcards #comics #music #musik #fashion","protected":false,"verified":false,"followers_count":4949,"friends_count":4548,"listed_count":31,"favourites_count":1608,"statuses_count":9168,"created_at":"Wed Jan 21 16:31:39 +0000 2009","utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"C6E2EE","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme2\/bg.gif","profile_background_image_url_https":"ht
 tps:\/\/abs.twimg.com\/images\/themes\/theme2\/bg.gif","profile_background_tile":false,"profile_link_color":"1F98C7","profile_sidebar_border_color":"C6E2EE","profile_sidebar_fill_color":"DAECF4","profile_text_color":"663B12","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/2444928975\/okma6mavb4i0rhd5i7nt_normal.gif","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/2444928975\/okma6mavb4i0rhd5i7nt_normal.gif","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/19294316\/1399652447","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":11,"favorite_count":36,"entities":{"hashtags":[{"text":"CyberMonday","indices":[55,67]},{"text":"paperli","indices":[68,76]},{"text":"BlackFriday","indices":[77,89]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UjZLAKWVHl","expanded_
 url":"http:\/\/amzn.to\/1pf9UgU","display_url":"amzn.to\/1pf9UgU","indices":[32,54]}],"user_mentions":[{"screen_name":"amazon","name":"Amazon","id":20793816,"id_str":"20793816","indices":[90,97]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"low","lang":"en"},"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"CyberMonday","indices":[72,84]},{"text":"paperli","indices":[85,93]},{"text":"BlackFriday","indices":[94,106]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UjZLAKWVHl","expanded_url":"http:\/\/amzn.to\/1pf9UgU","display_url":"amzn.to\/1pf9UgU","indices":[49,71]}],"user_mentions":[{"screen_name":"firewallman","name":"Igor Adolph","id":19294316,"id_str":"19294316","indices":[3,15]},{"screen_name":"amazon","name":"Amazon","id":20793816,"id_str":"20793816","indices":[107,114]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"141685311994
 6"}
+{"created_at":"Mon Nov 24 18:18:40 +0000 2014","id":536947020888408064,"id_str":"536947020888408064","text":"Be sure to make @RHTruckfitters one of your Black Friday destinations! #BlackFriday #RanchHand #HolidayShopping http:\/\/t.co\/tmHc0qCEYP","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2303382438,"id_str":"2303382438","name":"Truckfitters","screen_name":"RHTruckfitters","location":"8 Locations","url":"http:\/\/www.truckfitters.com","description":"Ranch Hand Truckfitters is the #1 Source for Truck Accessories selling all the brands you know & trust. 8 stores in the US! http:\/\/Truckfitters.com","protected":false,"verified":false,"followers_count":74,"friends_count":122,"listed_count":0,"favourites_count":11,"statuses_count":61,"created_at"
 :"Tue Jan 21 16:52:03 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"131516","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme14\/bg.gif","profile_background_tile":true,"profile_link_color":"C26A1D","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/425679272850624513\/BMnZxIKX_normal.png","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/425679272850624513\/BMnZxIKX_normal.png","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2303382438\/1390325155","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},
 "geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[71,83]},{"text":"RanchHand","indices":[84,94]},{"text":"HolidayShopping","indices":[95,111]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"RHTruckfitters","name":"Truckfitters","id":2303382438,"id_str":"2303382438","indices":[16,31]}],"symbols":[],"media":[{"id":536947019365879808,"id_str":"536947019365879808","indices":[112,134],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","url":"http:\/\/t.co\/tmHc0qCEYP","display_url":"pic.twitter.com\/tmHc0qCEYP","expanded_url":"http:\/\/twitter.com\/RHTruckfitters\/status\/536947020888408064\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":776,"resize":"fit"},"large":{"w":1024,"h":1325,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":440,"resize":"fit"}
 }}]},"extended_entities":{"media":[{"id":536947019365879808,"id_str":"536947019365879808","indices":[112,134],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeeCCCEAArdpQ.jpg","url":"http:\/\/t.co\/tmHc0qCEYP","display_url":"pic.twitter.com\/tmHc0qCEYP","expanded_url":"http:\/\/twitter.com\/RHTruckfitters\/status\/536947020888408064\/photo\/1","type":"photo","sizes":{"medium":{"w":600,"h":776,"resize":"fit"},"large":{"w":1024,"h":1325,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"small":{"w":340,"h":440,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853120430"}
+{"created_at":"Mon Nov 24 18:18:43 +0000 2014","id":536947032024702976,"id_str":"536947032024702976","text":"http:\/\/t.co\/UOKhHuOKsB #BlackFriday #EPIPHONE LES PAUL STANDARD EBONY\/Bigsby B7\/Updated Pickups\/Roller Bridge\/Grovers http:\/\/t.co\/3g96WS2rri","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238946,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang
 ":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_co
 unt":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]},{"text":"EPIPHONE","indices":[36,45]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/UOKhHuOKsB","expanded_url":"http:\/\/ift.tt\/1r2XOZA","display_url":"ift.tt\/1r2XOZA","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947031991152641,"id_str":"536947031991152641","indices":[118,140],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","url":"http:\/\/t.co\/3g96WS2rri","display_url":"pic.twitter.com\/3g96WS2rri","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947032024702976\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947031991152641,"id_str":"536947031991152641","indices":[118,140],"media_url":"http:\
 /\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeexEIcAEeZHE.jpg","url":"http:\/\/t.co\/3g96WS2rri","display_url":"pic.twitter.com\/3g96WS2rri","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947032024702976\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853123085"}
+{"created_at":"Mon Nov 24 18:18:43 +0000 2014","id":536947035627614208,"id_str":"536947035627614208","text":"@Kohls One Direction #BlackFriday #KohlsSweeps","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":34732438,"id_str":"34732438","name":"Jennifer MacArthur","screen_name":"LuckyJenx","location":"","url":null,"description":null,"protected":false,"verified":false,"followers_count":130,"friends_count":673,"listed_count":0,"favourites_count":6,"statuses_count":397,"created_at":"Thu Apr 23 21:18:22 +0000 2009","utc_offset":-18000,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"709397","profile_background_image_url":"http:\/\/abs.twimg.
 com\/images\/themes\/theme6\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme6\/bg.gif","profile_background_tile":false,"profile_link_color":"FF3300","profile_sidebar_border_color":"86A4A6","profile_sidebar_fill_color":"A0C5C7","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/472769626602864641\/CEGX3CSE_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/472769626602864641\/CEGX3CSE_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/34732438\/1392406660","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[21,33]},{"text":"KohlsSweeps","indices":[34,46]}],"trends":[],"urls":[],"user_menti
 ons":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853123944"}
+{"created_at":"Mon Nov 24 18:18:45 +0000 2014","id":536947042359463937,"id_str":"536947042359463937","text":"http:\/\/t.co\/GVBKu5NAfk #BlackFriday #2000 Ibanez RG7621 Japanese 7-String Hard Tail Guitar Dimarzio Made Pickups http:\/\/t.co\/ODduwZcSct","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238947,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","c
 ontributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"e
 ntities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/GVBKu5NAfk","expanded_url":"http:\/\/ift.tt\/1r2XPN4","display_url":"ift.tt\/1r2XPN4","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947042300743680,"id_str":"536947042300743680","indices":[113,135],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","url":"http:\/\/t.co\/ODduwZcSct","display_url":"pic.twitter.com\/ODduwZcSct","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947042359463937\/photo\/1","type":"photo","sizes":{"large":{"w":93,"h":140,"resize":"fit"},"thumb":{"w":93,"h":140,"resize":"crop"},"small":{"w":93,"h":140,"resize":"fit"},"medium":{"w":93,"h":140,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947042300743680,"id_str":"536947042300743680","indices":[113,135],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","medi
 a_url_https":"https:\/\/pbs.twimg.com\/media\/B3OefXeIUAA3th3.jpg","url":"http:\/\/t.co\/ODduwZcSct","display_url":"pic.twitter.com\/ODduwZcSct","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947042359463937\/photo\/1","type":"photo","sizes":{"large":{"w":93,"h":140,"resize":"fit"},"thumb":{"w":93,"h":140,"resize":"crop"},"small":{"w":93,"h":140,"resize":"fit"},"medium":{"w":93,"h":140,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"in","timestamp_ms":"1416853125549"}
+{"created_at":"Mon Nov 24 18:18:46 +0000 2014","id":536947044452012032,"id_str":"536947044452012032","text":"Do #BlackFriday with us! Get all the savings and none of the shoving! Visit: http:\/\/t.co\/jklPRkY8Ix http:\/\/t.co\/be39JseIP6","source":"\u003ca href=\"http:\/\/sproutsocial.com\" rel=\"nofollow\"\u003eSprout Social\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":137174096,"id_str":"137174096","name":"Puklich Chevrolet ","screen_name":"PuklichChevy","location":"3701 State Street Bismarck, ND","url":"http:\/\/www.puklich-chevrolet.com\/","description":"Puklich Chevrolet is your complete new Chevrolet dealer serving Bismarck\/Mandan. We have a large inventory of new and pre-owned Chevy vehicles.","protected":false,"verified":false,"followers_count":795,"friends_count":489,"listed_count":61,"favourites_count":12,"statuses_count"
 :7468,"created_at":"Mon Apr 26 01:20:44 +0000 2010","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":true,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"92BCD1","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/378800000178949491\/nS0NKRpj.jpeg","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/378800000178949491\/nS0NKRpj.jpeg","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/436228685457145856\/KjSv7Pui_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/436228685457145856\/KjSv7Pui_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/137174096\/1402524098","default_profile"
 :false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[3,15]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/jklPRkY8Ix","expanded_url":"http:\/\/bit.ly\/1zllYgP","display_url":"bit.ly\/1zllYgP","indices":[77,99]}],"user_mentions":[],"symbols":[],"media":[{"id":536947044380708866,"id_str":"536947044380708866","indices":[100,122],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","url":"http:\/\/t.co\/be39JseIP6","display_url":"pic.twitter.com\/be39JseIP6","expanded_url":"http:\/\/twitter.com\/PuklichChevy\/status\/536947044452012032\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":512,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":300,"resize":"fit"},"small":{
 "w":340,"h":170,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947044380708866,"id_str":"536947044380708866","indices":[100,122],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OeffOCEAIZiTY.jpg","url":"http:\/\/t.co\/be39JseIP6","display_url":"pic.twitter.com\/be39JseIP6","expanded_url":"http:\/\/twitter.com\/PuklichChevy\/status\/536947044452012032\/photo\/1","type":"photo","sizes":{"large":{"w":1024,"h":512,"resize":"fit"},"thumb":{"w":150,"h":150,"resize":"crop"},"medium":{"w":600,"h":300,"resize":"fit"},"small":{"w":340,"h":170,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853126048"}
+{"created_at":"Mon Nov 24 18:18:47 +0000 2014","id":536947052534448128,"id_str":"536947052534448128","text":"Enter for your shot at $10,000 and 100 Instant Win daily prizes from @Coupons #BlackFriday #Giveaway http:\/\/t.co\/8gSmhrQ0JA","source":"\u003ca href=\"https:\/\/dev.twitter.com\/docs\/tfw\" rel=\"nofollow\"\u003eTwitter for Websites\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":67502035,"id_str":"67502035","name":"ivelisse woods","screen_name":"ivel1977","location":"utica, ny ","url":null,"description":null,"protected":false,"verified":false,"followers_count":73,"friends_count":1949,"listed_count":1,"favourites_count":2,"statuses_count":2620,"created_at":"Fri Aug 21 02:43:38 +0000 2009","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_co
 lor":"9AE4E8","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme16\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme16\/bg.gif","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"BDDCAD","profile_sidebar_fill_color":"DDFFCC","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1872198615\/628070142Portrait-of-Alfred-Stieglitz-Man-Ray-1913_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/1872198615\/628070142Portrait-of-Alfred-Stieglitz-Man-Ray-1913_normal.jpg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[78,90]},{"text":"Giveaway","indices"
 :[91,100]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/8gSmhrQ0JA","expanded_url":"http:\/\/shout.lt\/K1wc","display_url":"shout.lt\/K1wc","indices":[101,123]}],"user_mentions":[{"screen_name":"Coupons","name":"Coupons.com","id":1451811,"id_str":"1451811","indices":[69,77]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853127975"}
+{"created_at":"Mon Nov 24 18:18:48 +0000 2014","id":536947053507919873,"id_str":"536947053507919873","text":"http:\/\/t.co\/Y9kH11COtM #BlackFriday #Peavey Raptor EXP Black Electric Guitar http:\/\/t.co\/WkgPMDMdG2","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238948,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_trans
 lator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Black
 Friday","indices":[23,35]},{"text":"Peavey","indices":[36,43]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/Y9kH11COtM","expanded_url":"http:\/\/ift.tt\/1r2XQk9","display_url":"ift.tt\/1r2XQk9","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947053465972737,"id_str":"536947053465972737","indices":[77,99],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","url":"http:\/\/t.co\/WkgPMDMdG2","display_url":"pic.twitter.com\/WkgPMDMdG2","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947053507919873\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947053465972737,"id_str":"536947053465972737","indices":[77,99],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","medi
 a_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegBEIMAELSYh.jpg","url":"http:\/\/t.co\/WkgPMDMdG2","display_url":"pic.twitter.com\/WkgPMDMdG2","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947053507919873\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853128207"}
+{"created_at":"Mon Nov 24 18:18:49 +0000 2014","id":536947057182134272,"id_str":"536947057182134272","text":"A look at the best deals for gamers this #BlackFriday from @gamespot  http:\/\/t.co\/BaoLzjGa7a","source":"\u003ca href=\"https:\/\/about.twitter.com\/products\/tweetdeck\" rel=\"nofollow\"\u003eTweetDeck\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":2891286782,"id_str":"2891286782","name":"Girls Can Game","screen_name":"girlscan_game","location":"NYC","url":"http:\/\/bit.ly\/GirlsCanGame","description":"Bridging the video game gap. Online publication focused on gaming, women, culture, community and everything that overlaps.","protected":false,"verified":false,"followers_count":54,"friends_count":393,"listed_count":1,"favourites_count":0,"statuses_count":31,"created_at":"Wed Nov 05 23:41:05 +0000 2014","utc_offset":null,"time_
 zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"3B94D9","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"000000","profile_text_color":"000000","profile_use_background_image":false,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/532053556061163521\/2YVOmA4m_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/532053556061163521\/2YVOmA4m_normal.jpeg","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday
 ","indices":[41,53]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/BaoLzjGa7a","expanded_url":"http:\/\/bit.ly\/BlackFridayGaming","display_url":"bit.ly\/BlackFridayGam\u2026","indices":[70,92]}],"user_mentions":[{"screen_name":"gamespot","name":"GameSpot","id":7157132,"id_str":"7157132","indices":[59,68]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853129083"}
+{"created_at":"Mon Nov 24 18:18:49 +0000 2014","id":536947059883257856,"id_str":"536947059883257856","text":"http:\/\/t.co\/ZmFFgc9EDJ #BlackFriday #2000 Ibanez RG7621 Japanese 7-String Hard Tail Guitar-Dimarzio Pickup-Hard Case http:\/\/t.co\/4OSUTkMHUX","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238949,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en
 ","contributors_enabled":false,"is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":
 0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/ZmFFgc9EDJ","expanded_url":"http:\/\/ift.tt\/11PGPNZ","display_url":"ift.tt\/11PGPNZ","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947059732254720,"id_str":"536947059732254720","indices":[117,139],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","url":"http:\/\/t.co\/4OSUTkMHUX","display_url":"pic.twitter.com\/4OSUTkMHUX","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947059883257856\/photo\/1","type":"photo","sizes":{"large":{"w":140,"h":93,"resize":"fit"},"medium":{"w":140,"h":93,"resize":"fit"},"thumb":{"w":140,"h":93,"resize":"crop"},"small":{"w":140,"h":93,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947059732254720,"id_str":"536947059732254720","indices":[117,139],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","
 media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegYaIEAAJ5hB.jpg","url":"http:\/\/t.co\/4OSUTkMHUX","display_url":"pic.twitter.com\/4OSUTkMHUX","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947059883257856\/photo\/1","type":"photo","sizes":{"large":{"w":140,"h":93,"resize":"fit"},"medium":{"w":140,"h":93,"resize":"fit"},"thumb":{"w":140,"h":93,"resize":"crop"},"small":{"w":140,"h":93,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853129727"}
+{"created_at":"Mon Nov 24 18:18:51 +0000 2014","id":536947066699022336,"id_str":"536947066699022336","text":"http:\/\/t.co\/Sqk0Jny4AT #BlackFriday #ESP Eclipse II http:\/\/t.co\/WyCGj7exkU","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238950,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_bac
 kground_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[23,35]
 },{"text":"ESP","indices":[36,40]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/Sqk0Jny4AT","expanded_url":"http:\/\/ift.tt\/11PGQ4w","display_url":"ift.tt\/11PGQ4w","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947066661273600,"id_str":"536947066661273600","indices":[52,74],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","url":"http:\/\/t.co\/WyCGj7exkU","display_url":"pic.twitter.com\/WyCGj7exkU","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947066699022336\/photo\/1","type":"photo","sizes":{"large":{"w":133,"h":140,"resize":"fit"},"medium":{"w":133,"h":140,"resize":"fit"},"thumb":{"w":133,"h":140,"resize":"crop"},"small":{"w":133,"h":140,"resize":"fit"}}}]},"extended_entities":{"media":[{"id":536947066661273600,"id_str":"536947066661273600","indices":[52,74],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OegyOIgAAwug3.jpg","media_url_https":"https:\/\/pbs.
 twimg.com\/media\/B3OegyOIgAAwug3.jpg","url":"http:\/\/t.co\/WyCGj7exkU","display_url":"pic.twitter.com\/WyCGj7exkU","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947066699022336\/photo\/1","type":"photo","sizes":{"large":{"w":133,"h":140,"resize":"fit"},"medium":{"w":133,"h":140,"resize":"fit"},"thumb":{"w":133,"h":140,"resize":"crop"},"small":{"w":133,"h":140,"resize":"fit"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"ro","timestamp_ms":"1416853131352"}
+{"created_at":"Mon Nov 24 18:18:52 +0000 2014","id":536947072738811904,"id_str":"536947072738811904","text":"@Kohls One Direction #BlackFriday #KohlsSweeps","source":"\u003ca href=\"http:\/\/twitter.com\/download\/iphone\" rel=\"nofollow\"\u003eTwitter for iPhone\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":536897286534471682,"in_reply_to_status_id_str":"536897286534471682","in_reply_to_user_id":35880417,"in_reply_to_user_id_str":"35880417","in_reply_to_screen_name":"Kohls","user":{"id":2362883828,"id_str":"2362883828","name":"Cori Nelson","screen_name":"nelsontch5","location":"","url":null,"description":"5th grade teacher","protected":false,"verified":false,"followers_count":273,"friends_count":660,"listed_count":1,"favourites_count":113,"statuses_count":138,"created_at":"Wed Feb 26 16:06:26 +0000 2014","utc_offset":null,"time_zone":null,"geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_backg
 round_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/440123708502331394\/FV3yjCcf_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/440123708502331394\/FV3yjCcf_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/2362883828\/1394569130","default_profile":true,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"BlackFriday","indices":[21,33]},{"text":"KohlsSweeps","indices":[34,4
 6]}],"trends":[],"urls":[],"user_mentions":[{"screen_name":"Kohls","name":"Kohl's","id":35880417,"id_str":"35880417","indices":[0,6]}],"symbols":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"en","timestamp_ms":"1416853132792"}
+{"created_at":"Mon Nov 24 18:18:52 +0000 2014","id":536947073401491456,"id_str":"536947073401491456","text":"http:\/\/t.co\/AtKRJzVHDU #BlackFriday #IBANEZ GIO GRX40 ELECTRIC GUITAR BLACK NICE!!!! http:\/\/t.co\/HeoqrC0QGd","source":"\u003ca href=\"http:\/\/ifttt.com\" rel=\"nofollow\"\u003eIFTTT\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":423038905,"id_str":"423038905","name":"MODERN HATCH","screen_name":"ModernHatch","location":"Midwest \u2708 Worldwide","url":null,"description":"Tis' the season for hot ish and more #deals!","protected":false,"verified":false,"followers_count":1137,"friends_count":1,"listed_count":60,"favourites_count":466,"statuses_count":238951,"created_at":"Mon Nov 28 00:50:01 +0000 2011","utc_offset":-21600,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"
 is_translator":false,"profile_background_color":"642D8B","profile_background_image_url":"http:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_image_url_https":"https:\/\/abs.twimg.com\/images\/themes\/theme10\/bg.gif","profile_background_tile":true,"profile_link_color":"FF0000","profile_sidebar_border_color":"65B0DA","profile_sidebar_fill_color":"7AC3EE","profile_text_color":"3D1957","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/498176767517941760\/_8feKya8_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/423038905\/1387864596","default_profile":false,"default_profile_image":false,"following":null,"follow_request_sent":null,"notifications":null},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text
 ":"BlackFriday","indices":[23,35]},{"text":"IBANEZ","indices":[36,43]}],"trends":[],"urls":[{"url":"http:\/\/t.co\/AtKRJzVHDU","expanded_url":"http:\/\/ift.tt\/11PGT0a","display_url":"ift.tt\/11PGT0a","indices":[0,22]}],"user_mentions":[],"symbols":[],"media":[{"id":536947073179201536,"id_str":"536947073179201536","indices":[85,107],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","url":"http:\/\/t.co\/HeoqrC0QGd","display_url":"pic.twitter.com\/HeoqrC0QGd","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947073401491456\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"extended_entities":{"media":[{"id":536947073179201536,"id_str":"536947073179201536","indices":[85,107],"media_url":"http:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.
 jpg","media_url_https":"https:\/\/pbs.twimg.com\/media\/B3OehKgIMAAF1Jf.jpg","url":"http:\/\/t.co\/HeoqrC0QGd","display_url":"pic.twitter.com\/HeoqrC0QGd","expanded_url":"http:\/\/twitter.com\/ModernHatch\/status\/536947073401491456\/photo\/1","type":"photo","sizes":{"small":{"w":105,"h":140,"resize":"fit"},"large":{"w":105,"h":140,"resize":"fit"},"medium":{"w":105,"h":140,"resize":"fit"},"thumb":{"w":105,"h":140,"resize":"crop"}}}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"filter_level":"medium","lang":"es","timestamp_ms":"1416853132950"}
+{"created_at":"Mon Nov 24 18:18:53 +0000 2014","id":536947074475233281,"id_str":"536947074475233281","text":"#Mashable's 3 #fitness trackers to look for #BlackFriday! Our sale starts 11\/28! http:\/\/t.co\/5NFIY4KhYJ #Vivofit http:\/\/t.co\/jjqIksmRWI","source":"\u003ca href=\"http:\/\/twitter.com\" rel=\"nofollow\"\u003eTwitter Web Client\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":16579129,"id_str":"16579129","name":"GPS City","screen_name":"GPSCity","location":"Calgary & Las Vegas","url":"http:\/\/www.gpscity.com","description":"The Original Online GPS Super Store since 1994! Tweeting about GPS-related news, technology, travel, geocaching, fitness & special offers.","protected":false,"verified":false,"followers_count":1872,"friends_count":621,"listed_count":74,"favourites_count":14,"statuses_count":3055,"created_at":"Fri Oct 03 
 15:30:59 +0000 2008","utc_offset":-28800,"time_zone":"Pacific Time (US & Canada)","geo_enabled":false,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"000000","profile_background_image_url":"http:\/\/pbs.twimg.com\/profile_background_images\/432925828\/twitter2.png","profile_background_image_url_https":"https:\/\/pbs.twimg.com\/profile_background_images\/432925828\/twitter2.png","profile_background_tile":false,"profile_link_color":"83838A","profile_sidebar_border_color":"1E1E1E","profile_sidebar_fill_color":"FFCC00","profile_text_color":"58595C","profile_use_background_image":true,"profile_image_url":"http:\/\/pbs.twimg.com\/profile_images\/1490449410\/261176_24852380666_3633199_n_normal.jpg","profile_image_url_https":"https:\/\/pbs.twimg.com\/profile_images\/149

<TRUNCATED>

[09/11] drill git commit: DRILL-2822: Changed timeout 90 s -> 120 s for two JDBC getColumns() tests.

Posted by pa...@apache.org.
DRILL-2822: Changed timeout 90 s -> 120 s for two JDBC getColumns() tests.

- Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest
- DatabaseMetaGetColumnsDataTest.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/9e4c016d
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/9e4c016d
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/9e4c016d

Branch: refs/heads/master
Commit: 9e4c016de6edd7489dee137976091046c6919dd8
Parents: ce9fc3a
Author: dbarclay <db...@maprtech.com>
Authored: Sat Apr 18 12:55:17 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:55 2015 -0700

----------------------------------------------------------------------
 .../java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java | 2 +-
 .../test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java    | 2 +-
 .../src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/9e4c016d/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java
index 42e343f..0f3d838 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/DatabaseMetaDataGetColumnsTest.java
@@ -2804,4 +2804,4 @@ public class DatabaseMetaDataGetColumnsTest extends JdbcTest {
                 rowsMetadata.isNullable( 24 ), equalTo( columnNoNulls ) );
   }
 
-} // class DatabaseMetaDataTest
+} // class DatabaseMetaGetColumnsDataTest

http://git-wip-us.apache.org/repos/asf/drill/blob/9e4c016d/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java
index 3dd3421..38c6d46 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest.java
@@ -47,7 +47,7 @@ public class Drill2128GetColumnsDataTypeNotTypeCodeIntBugsTest extends JdbcTest
   private static DatabaseMetaData dbMetadata;
 
   @Rule
-  public TestRule TIMEOUT = TestTools.getTimeoutRule( 90_000 /* ms */ );
+  public TestRule TIMEOUT = TestTools.getTimeoutRule( 120_000 /* ms */ );
 
   @BeforeClass
   public static void setUpConnection() throws Exception {

http://git-wip-us.apache.org/repos/asf/drill/blob/9e4c016d/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java
index 8c6604a..d5c9c71 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestJdbcMetadata.java
@@ -32,7 +32,7 @@ public class TestJdbcMetadata extends JdbcTestActionBase {
 
 
   @Rule
-  public TestRule TIMEOUT = TestTools.getTimeoutRule( 90_000 /* ms */ );
+  public TestRule TIMEOUT = TestTools.getTimeoutRule( 120_000 /* ms */ );
 
   @Test
   public void catalogs() throws Exception{


[06/11] drill git commit: DRILL-1832: Add unit tests for Json file with null values

Posted by pa...@apache.org.
DRILL-1832: Add unit tests for Json file with null values


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/25ea3e83
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/25ea3e83
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/25ea3e83

Branch: refs/heads/master
Commit: 25ea3e830c1274da2667d222e2833c3dd9699c33
Parents: 319b94c
Author: Parth Chandra <pc...@maprtech.com>
Authored: Fri Apr 17 09:27:58 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:54 2015 -0700

----------------------------------------------------------------------
 .../exec/store/json/TestJsonRecordReader.java   | 26 +++++++++++-
 .../jsoninput/drill-1832-1-result.json          | 43 ++++++++++++++++++++
 .../jsoninput/drill-1832-2-result.json          |  1 +
 .../test/resources/jsoninput/twitter_43.json    | 43 ++++++++++++++++++++
 4 files changed, 112 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/25ea3e83/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
index 44e2a2d..27631c3 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/json/TestJsonRecordReader.java
@@ -22,7 +22,6 @@ import org.apache.drill.common.exceptions.UserException;
 import org.apache.drill.exec.proto.UserBitShared;
 import org.junit.Test;
 import org.junit.Assert;
-
 import static org.junit.Assert.assertEquals;
 
 
@@ -72,6 +71,7 @@ public class TestJsonRecordReader extends BaseTestQuery{
   public void testEnableAllTextMode() throws Exception {
     testNoResult("alter session set `store.json.all_text_mode`= true");
     test("select * from cp.`jsoninput/big_numeric.json`");
+    testNoResult("alter session set `store.json.all_text_mode`= false");
   }
 
   @Test
@@ -86,4 +86,28 @@ public class TestJsonRecordReader extends BaseTestQuery{
 
   }
 
+  @Test //DRILL-1832
+  public void testJsonWithNulls1() throws Exception {
+
+    final String query="select * from cp.`jsoninput/twitter_43.json`";
+
+    testBuilder()
+            .sqlQuery(query)
+            .unOrdered()
+            .jsonBaselineFile("jsoninput/drill-1832-1-result.json")
+            .go();
+  }
+
+  @Test //DRILL-1832
+  public void testJsonWithNulls2() throws Exception {
+
+    final String query="select SUM(1) as `sum_Number_of_Records_ok` from cp.`/jsoninput/twitter_43.json` having (COUNT(1) > 0)";
+
+    testBuilder()
+            .sqlQuery(query)
+            .unOrdered()
+            .jsonBaselineFile("jsoninput/drill-1832-2-result.json")
+            .go();
+  }
+
 }


[08/11] drill git commit: DRILL-2782: 1-Hygiene: Various cleanup.

Posted by pa...@apache.org.
DRILL-2782: 1-Hygiene: Various cleanup.

- Fixed/moved checkNotClosed to after constructor.
- Removed redundant "public"; "privatized" logger.
- Purged unused imports.
- A little commenting, editing, wrapping.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/6e477e28
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/6e477e28
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/6e477e28

Branch: refs/heads/master
Commit: 6e477e2862446c64c6a591d94703921cd9c92e6b
Parents: a6256b1
Author: dbarclay <db...@maprtech.com>
Authored: Tue Apr 14 16:17:30 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:54 2015 -0700

----------------------------------------------------------------------
 .../org/apache/drill/jdbc/DrillConnection.java  | 17 +++++++---
 .../apache/drill/jdbc/DrillConnectionImpl.java  | 35 +++++++++-----------
 .../java/org/apache/drill/jdbc/MetaImpl.java    |  2 +-
 3 files changed, 29 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/6e477e28/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
index a52644d..6bacaad 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnection.java
@@ -24,18 +24,27 @@ import java.sql.SQLException;
 import org.apache.drill.exec.client.DrillClient;
 
 
-public interface DrillConnection extends Connection{
+/**
+ * Drill-specific {@link Connection}.
+ * @see #unwrap
+ */
+public interface DrillConnection extends Connection {
 
-  // in java.sql.Connection from JDK 1.7, but declare here to allow other JDKs
+  // In java.sql.Connection from JDK 1.7, but declared here to allow other JDKs.
   void setSchema(String schema) throws SQLException;
 
-  // in java.sql.Connection from JDK 1.7, but declare here to allow other JDKs
+  // In java.sql.Connection from JDK 1.7, but declared here to allow other JDKs.
   String getSchema() throws SQLException;
 
+
+  //////////////////////////////////////////////////////////////////////
+  // Drill extensions.
+
   /** Returns a view onto this connection's configuration properties. Code
    * within Optiq should use this view rather than calling
    * {@link java.util.Properties#getProperty(String)}. */
   DrillConnectionConfig config();
 
-  public DrillClient getClient();
+  DrillClient getClient();
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/6e477e28/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
index 2b18afb..79852a0 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
@@ -23,7 +23,6 @@ import java.sql.SQLException;
 import java.util.Properties;
 import java.util.TimeZone;
 
-import com.google.common.io.Files;
 import net.hydromatic.avatica.AvaticaConnection;
 import net.hydromatic.avatica.AvaticaFactory;
 import net.hydromatic.avatica.Helper;
@@ -31,18 +30,13 @@ import net.hydromatic.avatica.Meta;
 import net.hydromatic.avatica.UnregisteredDriver;
 
 import org.apache.drill.common.config.DrillConfig;
-import org.apache.drill.common.exceptions.ExecutionSetupException;
 import org.apache.drill.exec.client.DrillClient;
 import org.apache.drill.exec.memory.BufferAllocator;
 import org.apache.drill.exec.memory.TopLevelAllocator;
 import org.apache.drill.exec.rpc.RpcException;
 import org.apache.drill.exec.server.Drillbit;
-import org.apache.drill.exec.server.DrillbitContext;
 import org.apache.drill.exec.server.RemoteServiceSet;
 import org.apache.drill.exec.store.StoragePluginRegistry;
-import org.apache.drill.exec.store.dfs.FileSystemConfig;
-import org.apache.drill.exec.store.dfs.FileSystemPlugin;
-import org.apache.drill.exec.store.dfs.WorkspaceConfig;
 import org.apache.drill.exec.util.TestUtilities;
 
 // (Public until JDBC impl. classes moved out of published-intf. package. (DRILL-2089).)
@@ -53,8 +47,9 @@ import org.apache.drill.exec.util.TestUtilities;
  * Abstract to allow newer versions of JDBC to add methods.
  * </p>
  */
-public abstract class DrillConnectionImpl extends AvaticaConnection implements DrillConnection {
-  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillConnection.class);
+public abstract class DrillConnectionImpl extends AvaticaConnection
+                                          implements DrillConnection {
+  private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(DrillConnection.class);
 
   final DrillStatementRegistry openStatementsRegistry = new DrillStatementRegistry();
   final DrillConnectionConfig config;
@@ -64,18 +59,6 @@ public abstract class DrillConnectionImpl extends AvaticaConnection implements D
   private Drillbit bit;
   private RemoteServiceSet serviceSet;
 
-  /**
-   * Throws AlreadyClosedSqlException if this Connection is closed.
-   *
-   * @throws AlreadyClosedSqlException if Connection is closed
-   * @throws SQLException if error in calling {@link #isClosed()}
-   */
-  private void checkNotClosed() throws SQLException {
-    if ( isClosed() ) {
-      throw new AlreadyClosedSqlException( "Connection is already closed." );
-    }
-  }
-
   protected DrillConnectionImpl(Driver driver, AvaticaFactory factory, String url, Properties info) throws SQLException {
     super(driver, factory, url, info);
     this.config = new DrillConnectionConfig(info);
@@ -130,6 +113,18 @@ public abstract class DrillConnectionImpl extends AvaticaConnection implements D
     }
   }
 
+  /**
+   * Throws AlreadyClosedSqlException if this Connection is closed.
+   *
+   * @throws AlreadyClosedSqlException if Connection is closed
+   * @throws SQLException if error in calling {@link #isClosed()}
+   */
+  private void checkNotClosed() throws SQLException {
+    if ( isClosed() ) {
+      throw new AlreadyClosedSqlException( "Connection is already closed." );
+    }
+  }
+
   @Override
   public DrillConnectionConfig config() {
     return config;

http://git-wip-us.apache.org/repos/asf/drill/blob/6e477e28/exec/jdbc/src/main/java/org/apache/drill/jdbc/MetaImpl.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/MetaImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/MetaImpl.java
index 78ca221..2ac0b91 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/MetaImpl.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/MetaImpl.java
@@ -168,7 +168,7 @@ public class MetaImpl implements Meta {
   }
 
   /**
-   * Implements @link DatabaseMetaData#getColumns()}.
+   * Implements {@link DatabaseMetaData#getColumns()}.
    */
   public ResultSet getColumns(String catalog, Pat schemaPattern,
                               Pat tableNamePattern, Pat columnNamePattern) {


[02/11] drill git commit: DRILL-2811: Allow direct connection to drillbit from DrillClient

Posted by pa...@apache.org.
DRILL-2811: Allow direct connection to drillbit from DrillClient


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/a6256b17
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/a6256b17
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/a6256b17

Branch: refs/heads/master
Commit: a6256b175e1a75fbc323babac29c52401d975842
Parents: 25ea3e8
Author: Parth Chandra <pc...@maprtech.com>
Authored: Tue Apr 21 22:18:14 2015 -0700
Committer: Parth Chandra <pc...@maprtech.com>
Committed: Fri Apr 24 16:21:54 2015 -0700

----------------------------------------------------------------------
 .../apache/drill/exec/client/DrillClient.java   | 73 ++++++++++++++------
 .../drill/jdbc/DrillConnectionConfig.java       |  5 ++
 .../apache/drill/jdbc/DrillConnectionImpl.java  |  5 ++
 3 files changed, 61 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/a6256b17/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
index 0d29f60..ae0f580 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/client/DrillClient.java
@@ -82,25 +82,45 @@ public class DrillClient implements Closeable, ConnectionThrottle {
   private boolean supportComplexTypes;
   private final boolean ownsZkConnection;
   private final boolean ownsAllocator;
+  private final boolean isDirectConnection; // true if the connection bypasses zookeeper and connects directly to a drillbit
   private EventLoopGroup eventLoopGroup;
 
   public DrillClient() {
-    this(DrillConfig.create());
+    this(DrillConfig.create(), false);
+  }
+
+  public DrillClient(boolean isDirect) {
+    this(DrillConfig.create(), isDirect);
   }
 
   public DrillClient(String fileName) {
-    this(DrillConfig.create(fileName));
+    this(DrillConfig.create(fileName), false);
   }
 
   public DrillClient(DrillConfig config) {
-    this(config, null);
+    this(config, null, false);
+  }
+
+  public DrillClient(DrillConfig config, boolean isDirect) {
+    this(config, null, isDirect);
   }
 
   public DrillClient(DrillConfig config, ClusterCoordinator coordinator) {
-    this(config, coordinator, null);
+    this(config, coordinator, null, false);
+  }
+
+  public DrillClient(DrillConfig config, ClusterCoordinator coordinator, boolean isDirect) {
+    this(config, coordinator, null, isDirect);
   }
 
   public DrillClient(DrillConfig config, ClusterCoordinator coordinator, BufferAllocator allocator) {
+    this(config, coordinator, allocator, false);
+  }
+
+  public DrillClient(DrillConfig config, ClusterCoordinator coordinator, BufferAllocator allocator, boolean isDirect) {
+    // if isDirect is true, the client will connect directly to the drillbit instead of
+    // going thru the zookeeper
+    this.isDirectConnection = isDirect;
     this.ownsZkConnection = coordinator == null;
     this.ownsAllocator = allocator == null;
     this.allocator = ownsAllocator ? new TopLevelAllocator(config) : allocator;
@@ -151,30 +171,39 @@ public class DrillClient implements Closeable, ConnectionThrottle {
       return;
     }
 
-    if (ownsZkConnection) {
-      try {
-        this.clusterCoordinator = new ZKClusterCoordinator(this.config, connect);
-        this.clusterCoordinator.start(10000);
-      } catch (Exception e) {
-        throw new RpcException("Failure setting up ZK for client.", e);
+    final DrillbitEndpoint endpoint;
+    if (isDirectConnection) {
+      String[] connectInfo = props.getProperty("drillbit").split(":");
+      endpoint = DrillbitEndpoint.newBuilder()
+              .setAddress(connectInfo[0])
+              .setUserPort(Integer.parseInt(connectInfo[1]))
+              .build();
+    } else {
+      if (ownsZkConnection) {
+        try {
+          this.clusterCoordinator = new ZKClusterCoordinator(this.config, connect);
+          this.clusterCoordinator.start(10000);
+        } catch (Exception e) {
+          throw new RpcException("Failure setting up ZK for client.", e);
+        }
       }
-    }
 
-    if (props != null) {
-      UserProperties.Builder upBuilder = UserProperties.newBuilder();
-      for (String key : props.stringPropertyNames()) {
-        upBuilder.addProperties(Property.newBuilder().setKey(key).setValue(props.getProperty(key)));
+      if (props != null) {
+        UserProperties.Builder upBuilder = UserProperties.newBuilder();
+        for (String key : props.stringPropertyNames()) {
+          upBuilder.addProperties(Property.newBuilder().setKey(key).setValue(props.getProperty(key)));
+        }
+
+        this.props = upBuilder.build();
       }
 
-      this.props = upBuilder.build();
+      ArrayList<DrillbitEndpoint> endpoints = new ArrayList<>(clusterCoordinator.getAvailableEndpoints());
+      checkState(!endpoints.isEmpty(), "No DrillbitEndpoint can be found");
+      // shuffle the collection then get the first endpoint
+      Collections.shuffle(endpoints);
+      endpoint = endpoints.iterator().next();
     }
 
-    ArrayList<DrillbitEndpoint> endpoints = new ArrayList<>(clusterCoordinator.getAvailableEndpoints());
-    checkState(!endpoints.isEmpty(), "No DrillbitEndpoint can be found");
-    // shuffle the collection then get the first endpoint
-    Collections.shuffle(endpoints);
-    DrillbitEndpoint endpoint = endpoints.iterator().next();
-
     eventLoopGroup = createEventLoop(config.getInt(ExecConstants.CLIENT_RPC_THREADS), "Client-");
     client = new UserClient(supportComplexTypes, allocator, eventLoopGroup);
     logger.debug("Connecting to server {}:{}", endpoint.getAddress(), endpoint.getUserPort());

http://git-wip-us.apache.org/repos/asf/drill/blob/a6256b17/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionConfig.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionConfig.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionConfig.java
index de08cda..e353c71 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionConfig.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionConfig.java
@@ -35,6 +35,11 @@ public class DrillConnectionConfig extends ConnectionConfigImpl {
     return "local".equals(props.getProperty("zk"));
   }
 
+  // True if the URL points directly to a drillbit
+  public boolean isDirect(){
+    return props.getProperty("local")!=null;
+  }
+
   // TODO: Check: Shouldn't something validate that URL has "zk" parameter?
   public String getZookeeperConnectionString(){
     return props.getProperty("zk");

http://git-wip-us.apache.org/repos/asf/drill/blob/a6256b17/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
index 3fdbf84..2b18afb 100644
--- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
+++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/DrillConnectionImpl.java
@@ -110,6 +110,11 @@ public abstract class DrillConnectionImpl extends AvaticaConnection implements D
 
         this.client = new DrillClient(dConfig, set.getCoordinator());
         this.client.connect(null, info);
+      } else if(config.isDirect()) {
+        final DrillConfig dConfig = DrillConfig.forClient();
+        this.allocator = new TopLevelAllocator(dConfig);
+        this.client = new DrillClient(true); // Get a direct connection
+        this.client.connect(config.getZookeeperConnectionString(), info);
       } else {
         final DrillConfig dConfig = DrillConfig.forClient();
         this.allocator = new TopLevelAllocator(dConfig);