#!/bin/sh -e
# Licensed 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.
#

# usage: time benchbulk.sh
# it takes about 30 seconds to run on my old MacBook with bulksize 1000

BULKSIZE=100
DOCSIZE=10
INSERTS=10
ROUNDS=10
DBURL="http://127.0.0.1:5984/benchbulk"
POSTURL="$DBURL/_bulk_docs"

function make_bulk_docs() {
  ROW=0
  SIZE=$(($1-1))
  START=$2
  BODYSIZE=$3  
  
  BODY=$(printf "%0${BODYSIZE}d")

  echo '{"docs":['
  while [ $ROW -lt $SIZE ]; do
    printf '{"_id":"%020d", "body":"'$BODY'"},' $(($ROW + $START))
    let ROW=ROW+1
  done
  printf '{"_id":"%020d", "body":"'$BODY'"}' $(($ROW + $START))
  echo ']}'
}

echo "Making $INSERTS bulk inserts of $BULKSIZE docs each"

echo "Attempt to delete db at $DBURL"
curl -X DELETE $DBURL -w\\n

echo "Attempt to create db at $DBURL"
curl -X PUT $DBURL -w\\n

echo "Running $ROUNDS rounds of $INSERTS concurrent inserts to $POSTURL"
RUN=0
while [ $RUN -lt $ROUNDS ]; do

  POSTS=0
  while [ $POSTS -lt $INSERTS ]; do
    STARTKEY=$[ POSTS * BULKSIZE + RUN * BULKSIZE * INSERTS ]
    echo "startkey $STARTKEY bulksize $BULKSIZE"
    DOCS=$(make_bulk_docs $BULKSIZE $STARTKEY $DOCSIZE)
    # echo $DOCS
    echo $DOCS | curl -T - -X POST $POSTURL -w%{http_code}\ %{time_total}\ sec\\n >/dev/null 2>&1 &
    let POSTS=POSTS+1
  done

  echo "waiting"
  wait
  let RUN=RUN+1
done

curl $DBURL -w\\n
