STREAMS-679: add support for accessing and searching with twitter derived fields

resolves STREAMS-679
diff --git a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/search/SearchUtil.java b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/search/SearchUtil.java
index 4426c80..01dd20d 100644
--- a/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/search/SearchUtil.java
+++ b/streams-contrib/streams-provider-twitter/src/main/java/org/apache/streams/twitter/search/SearchUtil.java
@@ -88,6 +88,15 @@
     for( String time_zone : operator.getTimeZones()) {
       stringJoiner.add("time_zone:" + time_zone);
     }
+    if( operator.getProfileCountry() != null) {
+      stringJoiner.add("profile_country:" + operator.getProfileCountry());
+    }
+    if( operator.getProfileRegion() != null) {
+      stringJoiner.add("profile_region:" + operator.getProfileRegion());
+    }
+    if( operator.getProfileLocality() != null) {
+      stringJoiner.add("profile_locality:" + operator.getProfileLocality());
+    }
     if( operator.getHasImages() ) {
       stringJoiner.add("has:images");
     }
@@ -97,8 +106,8 @@
     if( operator.getHasMedia() ) {
       stringJoiner.add("has:media");
     }
-    if( operator.getHasImages() ) {
-      stringJoiner.add("has:image");
+    if( operator.getHasProfileGeo() ) {
+      stringJoiner.add("has:profile_geo");
     }
     if( operator.getHasVideos() ) {
       stringJoiner.add("has:video");
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ThirtyDaySearchRequest.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ThirtyDaySearchRequest.json
index 21f5cce..6740843 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ThirtyDaySearchRequest.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/api/ThirtyDaySearchRequest.json
@@ -13,6 +13,11 @@
       "required": true,
       "type": "string"
     },
+    "tag": {
+      "description": "Tags can be used to segregate rules and their matching data into different logical groups. If a rule tag is provided, the rule tag is included in the 'matching_rules' attribute.\n\nIt is recommended to assign rule-specific UUIDs to rule tags and maintain desired mappings on the client side.",
+      "required": false,
+      "type": "string"
+    },
     "fromDate": {
       "description": "The oldest UTC timestamp (back to 3/21/2006) from which the activities will be provided. Timestamp is in minute granularity and is inclusive (i.e. 12:00 includes the 00 minute).",
       "required": false,
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/SevenDaySearchProviderConfiguration.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/SevenDaySearchProviderConfiguration.json
index bc5450b..551517b 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/SevenDaySearchProviderConfiguration.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/SevenDaySearchProviderConfiguration.json
@@ -19,6 +19,25 @@
     "max_pages": {
       "type": "integer",
       "description": "Max pages to request"
+    },
+    "page_size": {
+      "type": "integer",
+      "description": "Requested items per page"
+    },
+    "geocode": {
+      "type": "string"
+    },
+    "lang": {
+      "type": "string"
+    },
+    "locale": {
+      "type": "string"
+    },
+    "result_type": {
+      "type": "string"
+    },
+    "include_entities": {
+      "type": "boolean"
     }
   }
 }
\ No newline at end of file
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/ThirtyDaySearchProviderConfiguration.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/ThirtyDaySearchProviderConfiguration.json
index 1d31bb3..c117b0f 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/ThirtyDaySearchProviderConfiguration.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/config/ThirtyDaySearchProviderConfiguration.json
@@ -12,6 +12,9 @@
     "query": {
       "$ref": "../api/ThirtyDaySearchRequest.json#properties/query"
     },
+    "tag": {
+      "$ref": "../api/ThirtyDaySearchRequest.json#properties/tag"
+    },
     "max_items": {
       "type": "integer",
       "description": "Max items total"
@@ -19,6 +22,10 @@
     "max_pages": {
       "type": "integer",
       "description": "Max pages to request"
+    },
+    "page_size": {
+      "type": "integer",
+      "description": "Requested items per page"
     }
   }
 }
\ No newline at end of file
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/User.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/User.json
index c6cb798..a560011 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/User.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/pojo/User.json
@@ -123,6 +123,50 @@
         },
         "status": {
             "$ref": "tweet.json"
+        },
+        "derived": {
+            "type": "object",
+            "properties": {
+                "locations": {
+                    "type": "array",
+                    "items": {
+                        "type": "object",
+                        "javaType" : "org.apache.streams.twitter.pojo.DerivedLocation",
+                        "properties": {
+                            "country": {
+                                "type": "string"
+                            },
+                            "country_code": {
+                                "type": "string"
+                            },
+                            "locality": {
+                                "type": "string"
+                            },
+                            "region": {
+                                "type": "string"
+                            },
+                            "sub_region": {
+                                "type": "string"
+                            },
+                            "full_name": {
+                                "type": "string"
+                            },
+                            "geo": {
+                                "type": "object",
+                                "properties": {
+                                    "coordinates": {
+                                        "type": "array",
+                                        "items": {
+                                            "type": "number"
+                                        }
+                                    },
+                                    "type": "string"
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
 
diff --git a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/search/ThirtyDaySearchOperator.json b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/search/ThirtyDaySearchOperator.json
index 2ae1657..3c78e8b 100644
--- a/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/search/ThirtyDaySearchOperator.json
+++ b/streams-contrib/streams-provider-twitter/src/main/jsonschema/org/apache/streams/twitter/search/ThirtyDaySearchOperator.json
@@ -121,6 +121,18 @@
         "type": "string"
       }
     },
+    "profile_country": {
+      "description": "Exact match on the “countryCode” field from the “address” object in the Profile Geo enrichment.\nUses a normalized set of two-letter country codes, based on ISO-3166-1-alpha-2 specification. This operator is provided in lieu of an operator for “country” field from the “address” object to be concise.",
+      "type": "string"
+    },
+    "profile_region": {
+      "description": "Matches on the “region” field from the “address” object in the Profile Geo enrichment.\nThis is an exact full string match. It is not necessary to escape characters with a backslash. For example, if matching something with a slash, use “one/two”, not “one\\/two”. Use double quotes to match substrings that contain whitespace or punctuation.",
+      "type": "string"
+    },
+    "profile_locality": {
+      "description": "Matches on the “locality” field from the “address” object in the Profile Geo enrichment.\nThis is an exact full string match. It is not necessary to escape characters with a backslash. For example, if matching something with a slash, use “one/two”, not “one\\/two”. Use double quotes to match substrings that contain whitespace or punctuation.",
+      "type": "string"
+    },
     "time_zones": {
       "description": "Matches Tweets where the user-selected time zone specified in a user’s profile settings matches a given string.",
       "type": "array",
@@ -135,6 +147,11 @@
         "type": "string"
       }
     },
+    "has_geo": {
+      "description": "Matches Tweets that have Tweet-specific geo location data provided from Twitter. This can be either “geo” lat-long coordinate, or a “location” in the form of a Twitter “Place”, with corresponding display name, geo polygon, and other fields.",
+      "type": "boolean",
+      "default": false
+    },
     "has_images": {
       "description": "A boolean search operator that returns all Tweets that contain a native images (e.g. pic.twitter.com).",
       "type": "boolean",
@@ -145,18 +162,23 @@
       "type": "boolean",
       "default": false
     },
+    "has_media": {
+      "description": "Matches Tweets that contain a media url classified by Twitter, e.g. pic.twitter.com.",
+      "type": "boolean",
+      "default": false
+    },
     "has_mentions": {
       "description": "Matches Tweets that mention another Twitter user.",
       "type": "boolean",
       "default": false
     },
-    "has_videos": {
-      "description": "A boolean search operator that returns all Tweets that contain native videos (does not include vine, periscope).",
+    "has_profile_geo": {
+      "description": "Matches Tweets that have any Profile Geo metadata, regardless of the actual value.",
       "type": "boolean",
       "default": false
     },
-    "has_media": {
-      "description": "Matches Tweets that contain a media url classified by Twitter, e.g. pic.twitter.com.",
+    "has_videos": {
+      "description": "A boolean search operator that returns all Tweets that contain native videos (does not include vine, periscope).",
       "type": "boolean",
       "default": false
     },