diff --git a/solr/bin/post b/solr/bin/post
index 6f5ca0babdb..481a9346c5d 100755
--- a/solr/bin/post
+++ b/solr/bin/post
@@ -14,11 +14,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# TODO wishlist:
-# - handle stdin as well, such that `cat foo.csv | bin/post my_collection` works
-# - support arbitrary posting like - java -Ddata=args org.apache.solr.util.SimplePostTool "SP2514N"
-
-# ====== Common code copied/adapted from bin/solr (TODO: centralize/share this kind of thing)
+# ====== Common code copied/adapted from bin/solr (TODO: centralize/share this kind of thing across bin/solr, etc)
THIS_SCRIPT="$0"
@@ -60,7 +56,7 @@ TOOL_JAR=$SOLR_TIP/dist/solr-core-*.jar
function print_usage() {
echo ""
- echo "Usage: post -c [OPTIONS]"
+ echo 'Usage: post -c [OPTIONS] '
echo " or post -help"
echo ""
echo " collection name defaults to DEFAULT_SOLR_COLLECTION if not specified"
@@ -72,27 +68,33 @@ function print_usage() {
echo " -host (default: localhost)"
echo " -port (default: 8983)"
echo " -commit yes|no (default: yes)"
+ # optimize intentionally omitted, but can be used as '-optimize yes' (default: no)
echo ""
echo " Web crawl options:"
echo " -recursive (default: 1)"
- echo " -delay (default=10)"
+ echo " -delay (default: 10)"
echo ""
echo " Directory crawl options:"
- echo " -delay (default=0)"
+ echo " -delay (default: 0)"
+ echo ""
+ echo " stdin/args options:"
+ echo " -type (default: application/xml)"
echo ""
echo " Other options:"
echo " -filetypes [,,...] (default: xml,json,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log)"
echo " -params \"=[&=...]\" (values must be URL-encoded; these pass through to Solr update request)"
- echo " -out yes|no (default=no; yes outputs Solr response to console)"
+ echo " -out yes|no (default: no; yes outputs Solr response to console)"
echo ""
echo ""
echo "Examples:"
echo ""
- echo "JSON file: $THIS_SCRIPT -c wizbang events.json"
- echo "XML files: $THIS_SCRIPT -c records article*.xml"
- echo "CSV file: $THIS_SCRIPT -c signals LATEST-signals.csv"
- echo "Directory of files: $THIS_SCRIPT -c myfiles ~/Documents"
- echo "Web crawl: $THIS_SCRIPT -c gettingstarted http://lucidworks.com -recursive 2 -delay 1"
+ echo "* JSON file: $THIS_SCRIPT -c wizbang events.json"
+ echo "* XML files: $THIS_SCRIPT -c records article*.xml"
+ echo "* CSV file: $THIS_SCRIPT -c signals LATEST-signals.csv"
+ echo "* Directory of files: $THIS_SCRIPT -c myfiles ~/Documents"
+ echo "* Web crawl: $THIS_SCRIPT -c gettingstarted http://lucidworks.com -recursive 2 -delay 1"
+ echo "* Standard input (stdin): echo '{"commit": {}}' | $THIS_SCRIPT -c my_collection -type application/json -out yes -d"
+ echo "* Data as string: $THIS_SCRIPT -c signals -type text/csv -out yes -d $'id,value\n1,0.47'"
echo ""
} # end print_usage
@@ -107,6 +109,7 @@ PROPS="-Dauto=yes"
RECURSIVE=""
FILES=()
URLS=()
+ARGS=()
while [ $# -gt 0 ]; do
# TODO: natively handle the optional parameters to SPT
@@ -115,18 +118,15 @@ while [ $# -gt 0 ]; do
if [[ -d "$1" ]]; then
# Directory
# echo "$1: DIRECTORY"
- MODE="files"
RECURSIVE="-Drecursive=yes"
FILES+=("$1")
elif [[ -f "$1" ]]; then
# File
# echo "$1: FILE"
- MODE="files"
FILES+=("$1")
elif [[ "$1" == http* ]]; then
# URL
# echo "$1: URL"
- MODE="web"
URLS+=("$1")
else
if [[ $1 == -* ]]; then
@@ -134,6 +134,19 @@ while [ $# -gt 0 ]; do
# Special case, pull out collection name
shift
COLLECTION=$1
+ elif [[ ($1 == "-d" || $1 == "--data" || $1 == "-") ]]; then
+ if [[ -s /dev/stdin ]]; then
+ MODE="stdin"
+ else
+ # when no stdin exists and -d specified, the rest of the arguments
+ # are assumed to be strings to post as-is
+ MODE="args"
+ shift
+ if [[ $# -gt 0 ]]; then
+ ARGS=("$@")
+ shift $#
+ fi
+ fi
else
key=${1:1}
shift
@@ -149,33 +162,54 @@ while [ $# -gt 0 ]; do
done
# Check for errors
-if [[ ${#FILES[@]} != 0 && ${#URLS[@]} != 0 ]]; then
- echo -e "\nCombining files (or directories) and URLs is not supported. Post them separately.\n"
- exit 1
-fi
-
-if [[ ${#FILES[@]} == 0 && ${#URLS[@]} == 0 ]]; then
- echo -e "\nNo files, directories, or URLs were specified. See '$THIS_SCRIPT -h' for usage instructions.\n"
- exit 1
-fi
-
if [[ $COLLECTION == "" ]]; then
echo -e "\nCollection must be specified. Use -c or set DEFAULT_SOLR_COLLECTION in your environment.\n"
exit 1
fi
-PARAMS=""
-if [[ $FILES != "" ]]; then
- MODE="files"
- PARAMS=("${FILES[@]}")
+# Unsupported: bin/post -c foo
+if [[ ${#FILES[@]} == 0 && ${#URLS[@]} == 0 && $MODE != "stdin" && $MODE != "args" ]]; then
+ echo -e "\nNo files, directories, URLs, -d strings, or stdin were specified. See '$THIS_SCRIPT -h' for usage instructions.\n"
+ exit 1
fi
-if [[ $URLS != "" ]]; then
- MODE="web"
- PARAMS=("${URLS[@]}")
+# SPT does not support mixing different data mode types, just files, just URLs, just stdin, or just argument strings.
+# The following are unsupported constructs:
+# bin/post -c foo existing_file.csv http://example.com
+# echo '' | bin/post -c foo existing_file.csv
+# bin/post -c foo existing_file.csv -d 'anything'
+if [[ (${#FILES[@]} != 0 && ${#URLS[@]} != 0 && $MODE != "stdin" && $MODE != "args")
+ || ((${#FILES[@]} != 0 || ${#URLS[@]} != 0) && ($MODE == "stdin" || $MODE == "args")) ]]; then
+ echo -e "\nCombining files/directories, URLs, stdin, or args is not supported. Post them separately.\n"
+ exit 1
+fi
+
+PARAMS=""
+
+# TODO: let's simplify this
+if [[ $MODE != "stdin" && $MODE != "args" ]]; then
+ if [[ $FILES != "" ]]; then
+ MODE="files"
+ PARAMS=("${FILES[@]}")
+ fi
+
+ if [[ $URLS != "" ]]; then
+ MODE="web"
+ PARAMS=("${URLS[@]}")
+ fi
+else
+ if [[ ${#ARGS[@]} == 0 ]]; then
+ # SPT needs a valid (to post to Solr) args string, useful for 'bin/post -c foo -d' to force a commit
+ ARGS+=("")
+ fi
+ PARAMS=("${ARGS[@]}")
fi
PROPS="$PROPS -Dc=$COLLECTION -Ddata=$MODE $RECURSIVE"
-#echo "$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}"
-"$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}"
\ No newline at end of file
+echo "$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}"
+"$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}"
+
+# post smoker:
+# bin/post -c signals -out yes -type application/json -d '[{"id": 2, "val": 0.47}]'
+# bin/post -c signals -out yes -params "wt=json" -d '1'