#!/bin/bash # Usage: # $ npm run migrate-0.3.0-to-0.4.0 -h localhost -p 10041 -t "known-events" exist_command() { type "$1" > /dev/null 2>&1 } if ! exist_command curl; then echo "ERROR: This migration script depends on the 'curl' command." exit 1 fi if ! exist_command jq; then echo "ERROR: This migration script depends on the 'jq' command." exit 1 fi while getopts h:p:t:d OPT do case $OPT in "h") GROONGA_HOST="$OPTARG" ;; "p") GROONGA_PORT="$OPTARG" ;; "t") EXTRA_TAG="$OPTARG" ;; "d") DRY_RUN=1 ;; esac done : ${GROONGA_HOST:=localhost} : ${GROONGA_PORT:=10041} if [ "$EXTRA_TAG" != "" ] then EXTRA_TAG=",\"$EXTRA_TAG\"" fi GROONGA="http://$GROONGA_HOST:$GROONGA_PORT/d" d() { if [ "$DRY_RUN" = "1" ] then echo "> $1" if [ "$2" != "" ] then echo "> ${2:1}" cat "${2:1}" fi return fi if [ "$2" != "" ] then curl -s "$GROONGA/$1" -d "$2" > /dev/null else curl -s "$GROONGA/$1" > /dev/null fi } d_select() { curl -s "$GROONGA/select?$1" } break_line() { if [ ! -f "$1" ] then echo "," >> "$2" else echo "" >> "$2" fi } echo "Preparing required tables..." d "table_create?name=Tags&flags=TABLE_HASH_KEY&key_type=ShortText" d "column_create?table=Tags&name=icon&flags=COLUMN_SCALAR&type=ShortText" d "table_create?name=Actors&flags=TABLE_HASH_KEY&key_type=ShortText" d "column_create?table=Actors&name=uri&flags=COLUMN_SCALAR&type=ShortText" d "column_create?table=Actors&name=icon&flags=COLUMN_SCALAR&type=ShortText" d "column_create?table=Actors&name=class&flags=COLUMN_SCALAR&type=ShortText" echo "Preparing tags..." tags=$(mktemp) first_record_done=$(mktemp) echo -n "[" >> "$tags" d_select "table=Events&limit=0&drilldown=scope&drilldown_limit=-1&drilldown_output_columns=_key" | \ jq ".[1][1][3:][][]" | \ while read scope do break_line "$first_record_done" "$tags" icon=$(d_select "table=Events&limit=1&filter=scope==$scope&output_columns=scope_icon" | \ jq ".[1][0][2][]") echo -n "[$scope,$icon]" >> "$tags" rm -f "$first_record_done" done echo "" >> "$tags" echo "]" >> "$tags" d "load?table=Tags&columns=_key,icon" "@$tags" rm -f "$tags" rm -f "$first_record_done" echo "Preparing actors..." actors=$(mktemp) first_record_done=$(mktemp) echo -n "[" >> "$actors" d_select "table=Events&limit=0&drilldown=actor&drilldown_limit=-1&drilldown_output_columns=_key" | \ jq ".[1][1][3:][][]" | \ while read actor do break_line "$first_record_done" "$actors" echo -n "[$actor" >> "$actors" for field in $(d_select "table=Events&limit=1&filter=actor==$actor&output_columns=actor_icon,actor_uri,actor_class" | \ jq ".[1][0][2][]") do echo -n ",$field" >> "$actors" done echo -n "]" >> "$actors" rm -f "$first_record_done" done echo "" >> "$actors" echo "]" >> "$actors" d "load?table=Actors&columns=_key,icon,uri,class" "@$actors" rm -f "$actors" rm -f "$first_record_done" echo "Migrating actor related columns..." d "column_rename?table=Events&name=actor&new_name=old_actor" d "column_create?table=Events&name=actor&flags=COLUMN_SCALAR&type=Actors" events=$(mktemp) first_record_done=$(mktemp) echo -n "[" >> "$events" d_select "table=Events&limit=-1&output_columns=_key,actor,old_actor" | \ jq -c ".[1][0][2:][]" | \ while read record do break_line "$first_record_done" "$events" key=$(echo "$record" | jq ".[0]") old_actor=$(echo "$record" | jq ".[2]") # for dry-run mode, there is no old_actor column yet. if [ "$old_actor" = "null" ] then actor=$(echo "$record" | jq ".[1]") old_actor="$actor" fi echo -n "[$key,$old_actor]" >> "$events" rm -f "$first_record_done" done echo "" >> "$events" echo "]" >> "$events" d "load?table=Events&columns=_key,actor" "@$events" rm -f "$events" rm -f "$first_record_done" echo "Migrating scope column to tags..." d "column_create?table=Events&name=tags&flags=COLUMN_VECTOR&type=Tags" events=$(mktemp) first_record_done=$(mktemp) echo -n "[" >> "$events" d_select "table=Events&limit=-1&output_columns=_key,scope" | \ jq -c ".[1][0][2:][]" | \ while read record do break_line "$first_record_done" "$events" key=$(echo "$record" | jq ".[0]") scope=$(echo "$record" | jq ".[1]") echo -n "[$key,[$scope$EXTRA_TAG]]" >> "$events" rm -f "$first_record_done" done echo "" >> "$events" echo "]" >> "$events" d "load?table=Events&columns=_key,tags" "@$events" rm -f "$events" rm -f "$first_record_done" echo "Migrating indexes..." d "column_remove?table=Terms&name=Events_actor_index" d "column_create?table=Actors&name=Events_actor_index&flags=COLUMN_INDEX&type=Events&source=actor" d "column_create?table=Tags&name=Events_tags_index&flags=COLUMN_INDEX&type=Events&source=tags"