Skip to content

v0.2.51..v0.2.52 changeset ServiceChangesetReplacement.sh.off

Garret Voltz edited this page Jan 15, 2020 · 1 revision
diff --git a/test-files/cmd/glacial/serial/ServiceChangesetReplacement.sh.off b/test-files/cmd/glacial/serial/ServiceChangesetReplacement.sh.off
new file mode 100755
index 0000000..835def6
--- /dev/null
+++ b/test-files/cmd/glacial/serial/ServiceChangesetReplacement.sh.off
@@ -0,0 +1,331 @@
+#!/bin/bash
+set -e
+
+# This script tests the replacement changeset generation workflow for various geometry types. It is called from the 
+# ServiceChangesetReplacement*.sh tests
+#
+# Multiple input formats are tested here. Each time the resultant changeset is written back to an OSM API database regardless of the 
+# source format, as that allows for ease of visual inspection of the changes and makes debugging easier.
+#
+# Pay close attention to the modify change counts, as you can end up with output that looks correct but isn't due to ways being deleted and 
+# re-created when they should have been modified.
+
+# TODO: 
+# - consolidate the three replacement workflows into a single function
+# - can maybe also ditch the single geometry tests, as they may be redundant with the multiple geometry tests (except for the POI test)
+
+TEST_NAME=$1
+echo "test name: " $TEST_NAME
+SOURCE_FILE_1=$2
+echo "source file 1: " $SOURCE_FILE_1
+CROP_AOI=$5
+echo "crop aoi: " $CROP_AOI
+CROP_OPTS="-D crop.bounds=$CROP_AOI"
+if [[ "$CROP_AOI" == "-180,-90,180,90" ]]; then # if a global crop bounds was passed in, then don't crop
+  CROP_OPTS=""
+fi
+SOURCE_FILE_2=$3
+# If only one source file was passed in, we'll perturb it and use the original data for the secondary and the perturbed for the ref.
+if [ "$SOURCE_FILE_2" == "" ]; then
+  SOURCE_FILE_2=$SOURCE_FILE_1
+  if [ "$CROP_OPTS" == "" ]; then
+    REF_CONVERT_OPS="hoot::SetTagValueVisitor;hoot::PertyOp"
+    SEC_CONVERT_OPS="hoot::SetTagValueVisitor"
+  else
+    REF_CONVERT_OPS="hoot::MapCropper;hoot::SetTagValueVisitor;hoot::PertyOp"
+    SEC_CONVERT_OPS="hoot::MapCropper;hoot::SetTagValueVisitor"
+  fi
+  PERTURBING_REF="true"
+else
+  if [ "$CROP_OPTS" == "" ]; then
+    REF_CONVERT_OPS="hoot::SetTagValueVisitor"
+    SEC_CONVERT_OPS="hoot::SetTagValueVisitor"
+  else
+    REF_CONVERT_OPS="hoot::MapCropper;hoot::SetTagValueVisitor"
+    SEC_CONVERT_OPS="hoot::MapCropper;hoot::SetTagValueVisitor"
+  fi
+  PERTURBING_REF="false"
+fi 
+echo "source file 2: " $SOURCE_FILE_2
+echo "REF_CONVERT_OPS: " $REF_CONVERT_OPS
+echo "SEC_CONVERT_OPS: " $SEC_CONVERT_OPS
+REPLACEMENT_AOI=$4
+echo "replacement aoi: " $REPLACEMENT_AOI
+FULL_REPLACEMENT=$6
+if [ "$FULL_REPLACEMENT" == "true" ]; then
+  FULL_REPLACEMENT="--full-replacement"
+else
+  FULL_REPLACEMENT=""
+fi
+echo "full replacement: " $FULL_REPLACEMENT
+STRICT_BOUNDS=$7
+if [ "$STRICT_BOUNDS" == "true" ]; then
+  STRICT_BOUNDS="--strict-bounds"
+else
+  STRICT_BOUNDS=""
+fi
+echo "strict bounds: " $STRICT_BOUNDS
+if [ "$8" == "" ]; then
+  GEOMETRY_FILTERS=""
+  TAG_ELEMENT_CRITERIA="hoot::BuildingCriterion;hoot::HighwayCriterion;hoot::PoiCriterion"
+else
+  GEOMETRY_FILTERS=" --geometry-filters "$8
+  TAG_ELEMENT_CRITERIA=$8
+fi 
+echo "geometry filters: " $GEOMETRY_FILTERS
+echo "tag element criteria: " $TAG_ELEMENT_CRITERIA
+if [ "$9" == "" ]; then
+  REPLACEMENT_FILTERS=""
+else
+  REPLACEMENT_FILTERS=" --replacement-filters "$9
+fi
+echo "replacement filters: " $REPLACEMENT_FILTERS
+CHAIN_REPLACEMENT_FILTERS=${10}
+if [ "$CHAIN_REPLACEMENT_FILTERS" == "true" ]; then
+  CHAIN_REPLACEMENT_FILTERS="--chain-replacement-filters"
+else
+  CHAIN_REPLACEMENT_FILTERS=""
+fi
+echo "chain replacement filters: " $CHAIN_REPLACEMENT_FILTERS 
+if [ "${11}" == "" ]; then
+  REPLACEMENT_FILTER_OPTIONS=""
+else
+  REPLACEMENT_FILTER_OPTIONS=" --replacement-filter-options "${11}
+fi
+echo "replacement filter options: " $REPLACEMENT_FILTER_OPTIONS
+if [ "${12}" == "" ]; then
+  RETAINMENT_FILTERS=""
+else
+  RETAINMENT_FILTERS=" --retainment-filters "${12}
+fi
+echo "retainment filters: " $REPLACEMENT_FILTERS
+CHAIN_RETAINMENT_FILTERS=${13}
+if [ "$CHAIN_RETAINMENT_FILTERS" == "true" ]; then
+  CHAIN_RETAINMENT_FILTERS="--chain-retainment-filters"
+else
+  CHAIN_RETAINMENT_FILTERS=""
+fi
+echo "chain retainment filters: " $CHAIN_RETAINMENT_FILTERS 
+if [ "${14}" == "" ]; then
+  RETAINMENT_FILTER_OPTIONS=""
+else
+  RETAINMENT_FILTER_OPTIONS=" --retainment-filter-options "${14}
+fi
+echo "retainment filter options: " $RETAINMENT_FILTER_OPTIONS
+SOURCE_FORMATS=${15}
+echo "source formats: " $SOURCE_FORMATS 
+if [ "${16}" == "" ]; then
+  WAY_SNAP_TOLERANCE="0.0"
+else
+  WAY_SNAP_TOLERANCE=${16}
+fi
+echo "way snap tolerance: " $WAY_SNAP_TOLERANCE 
+if [ "${17}" == "" ]; then
+  EXISTING_WAY_NODE_TOLERANCE="0.0"
+else
+  EXISTING_WAY_NODE_TOLERANCE=${17}
+fi
+echo "existing way node tolerance: " $EXISTING_WAY_NODE_TOLERANCE 
+CUSTOM_TAG_KEY="note"
+CUSTOM_TAG_VAL="Source"
+
+IN_DIR=test-files/cmd/glacial/serial/$TEST_NAME
+OUT_DIR=test-output/cmd/glacial/serial/$TEST_NAME
+rm -rf $OUT_DIR
+mkdir -p $OUT_DIR
+
+source conf/database/DatabaseConfig.sh
+export OSM_API_DB_URL="osmapidb://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME_OSMAPI"
+export OSM_API_DB_AUTH="-h $DB_HOST -p $DB_PORT -U $DB_USER"
+export PGPASSWORD=$DB_PASSWORD_OSMAPI
+REF_DB_INPUT=$OSM_API_DB_URL
+
+GENERAL_OPTS="--warn -C UnifyingAlgorithm.conf -C Testing.conf -D log.class.filter= -D uuid.helper.repeatable=true -D writer.include.debug.tags=true -D reader.add.source.datetime=false -D writer.include.circular.error.tags=false -D debug.maps.write=false"
+DB_OPTS="-D api.db.email=OsmApiDbHootApiDbConflate@hoottestcpp.org -D hootapi.db.writer.create.user=true -D hootapi.db.writer.overwrite.map=true -D changeset.user.id=1"
+PERTY_OPTS="-D random.seed=1 -D perty.systematic.error.x=15 -D perty.systematic.error.y=15 -D perty.ops= "
+CHANGESET_DERIVE_OPTS="-D changeset.user.id=1 -D bounds.output.file=$OUT_DIR/$TEST_NAME-bounds.osm -D snap.unconnected.ways.existing.way.node.tolerance=$EXISTING_WAY_NODE_TOLERANCE -D snap.unconnected.ways.snap.tolerance=$WAY_SNAP_TOLERANCE "
+
+# DB SOURCE WORKFLOW
+
+if [[ $SOURCE_FORMATS == *"db"* ]]; then
+
+  HOOT_DB_URL="hootapidb://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME"
+  SEC_DB_INPUT="$HOOT_DB_URL/$TEST_NAME-sec"
+  CHANGESET_DB=$OUT_DIR/$TEST_NAME-changeset-db.osc.sql
+  CHANGESET_DB_DEBUG=$OUT_DIR/$TEST_NAME-changeset-db.osc
+  OUT_DB=$TEST_NAME-db-replaced.osm
+
+  # DATA PREP
+
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing reference dataset from: $SOURCE_FILE_1 to an osm api db (contains features to be replaced)..."
+  else
+    echo "Cropping the reference dataset from: $SOURCE_FILE_1 to: $CROP_AOI, then writing to an osm api db (contains features to be replaced)..."
+  fi
+  echo ""
+  scripts/database/CleanAndInitializeOsmApiDb.sh
+  hoot convert $GENERAL_OPTS $DB_OPTS $CROP_OPTS $PERTY_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref-db.osm -D reader.use.data.source.ids=false -D id.generator=hoot::PositiveIdGenerator -D convert.ops=$REF_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 1" $SOURCE_FILE_1 $REF_DB_INPUT 
+  # needed for debugging only:
+  #hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref.osm -D reader.use.data.source.ids=true $REF_DB_INPUT $OUT_DIR/ref-original-tmp.osm
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing the secondary dataset from: $SOURCE_FILE_2 to a hoot api db (contains features to replace with)..."
+  else
+    echo "Cropping the secondary dataset from: $SOURCE_FILE_2 to: $CROP_AOI, then writing it to a hoot api db (contains features to replace with)..."
+  fi
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS $CROP_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-sec-db.osm -D reader.use.data.source.ids=false -D convert.ops=$SEC_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 2" $SOURCE_FILE_2 $SEC_DB_INPUT
+  # needed for debugging only:
+  #hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-sec.osm -D reader.use.data.source.ids=true $SEC_DB_INPUT $OUT_DIR/sec-original-tmp.osm
+
+  # CHANGESET DERIVATION
+
+  echo ""
+  echo "Deriving a changeset between the osm api db and the hoot api db layers over: $REPLACEMENT_AOI, to file: $CHANGESET_DB that replaces features in the reference dataset with those from a secondary dataset..."
+  echo ""
+  hoot changeset-derive-replacement $GENERAL_OPTS $DB_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-db.osm $REF_DB_INPUT $SEC_DB_INPUT $REPLACEMENT_AOI $CHANGESET_DB $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+  # debug only
+  # hoot changeset-derive-replacement $GENERAL_OPTS $DB_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-db.osm $REF_DB_INPUT $SEC_DB_INPUT $REPLACEMENT_AOI $CHANGESET_DB_DEBUG $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+
+  # CHANGESET APPLICATION
+
+  echo ""
+  echo "Applying the changeset: $CHANGESET_DB to the reference data in the osm api db..."
+  echo ""
+  hoot changeset-apply $GENERAL_OPTS $DB_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-apply-db.osm $CHANGESET_DB $OSM_API_DB_URL
+  echo ""
+  echo "Reading the entire reference dataset out of the osm api db to: $OUT_DB for verification..."
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/final-write-db.osm $OSM_API_DB_URL $OUT_DIR/$OUT_DB
+  hoot diff $GENERAL_OPTS $IN_DIR/$OUT_DB $OUT_DIR/$OUT_DB
+
+  # CLEANUP
+
+  hoot db-delete-map $HOOT_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/cleanup-db.osm $SEC_DB_INPUT
+
+fi
+
+# XML SOURCE WORKFLOW
+
+if [[ $SOURCE_FORMATS == *"xml"* ]]; then
+
+  if [ "$PERTURBING_REF" == "true" ]; then
+    REF_XML_INPUT=$OUT_DIR/ref-perturbed-original.osm
+  else
+    REF_XML_INPUT=$OUT_DIR/ref-original.osm
+  fi
+  SEC_XML_INPUT=$OUT_DIR/sec-original.osm
+  CHANGESET_XML=$OUT_DIR/$TEST_NAME-changeset-xml.osc.sql
+  CHANGESET_XML_DEBUG=$OUT_DIR/$TEST_NAME-changeset-xml.osc
+  OUT_XML=$TEST_NAME-xml-replaced.osm
+
+  # DATA PREP
+
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing the reference dataset from: $SOURCE_FILE_1 to an osm api db (contains features to be replaced)..."
+  else
+    echo "Cropping the reference dataset from: $SOURCE_FILE_1 to: $CROP_AOI, then writing it to an osm api db (contains features to be replaced)..."
+  fi
+  echo ""
+  scripts/database/CleanAndInitializeOsmApiDb.sh
+  hoot convert $GENERAL_OPTS $DB_OPTS $CROP_OPTS $PERTY_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref-xml.osm -D reader.use.data.source.ids=false -D id.generator=hoot::PositiveIdGenerator -D convert.ops=$REF_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 1" $SOURCE_FILE_1 $REF_DB_INPUT
+  echo ""
+  echo "Writing the reference dataset from the osm apidb to an xml file: $REF_XML_INPUT (contains features to be replaced)..."
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref-xml.osm -D reader.use.data.source.ids=true $REF_DB_INPUT $REF_XML_INPUT
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing the secondary dataset from: $SOURCE_FILE_2 to an xml file: $SEC_XML_INPUT (contains features to replace with)..."
+  else
+    echo "Cropping the secondary dataset from: $SOURCE_FILE_2 to: $CROP_AOI, then writing it to an xml file: $SEC_XML_INPUT (contains features to replace with)..."
+  fi
+  echo ""
+  hoot convert $GENERAL_OPTS $CROP_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-sec-xml.osm -D reader.use.data.source.ids=false -D convert.ops=$SEC_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 2" $SOURCE_FILE_2 $SEC_XML_INPUT
+
+  # CHANGESET DERIVATION
+
+  echo ""
+  echo "Deriving a changeset between $REF_XML_INPUT and $SEC_XML_INPUT over: $REPLACEMENT_AOI, to file: $CHANGESET_XML that replaces features in the reference dataset with those from a secondary dataset..."
+  echo ""
+  hoot changeset-derive-replacement $GENERAL_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-xml.osm $REF_XML_INPUT $SEC_XML_INPUT $REPLACEMENT_AOI $CHANGESET_XML $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+  # debug only
+  # hoot changeset-derive-replacement $GENERAL_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-xml.osm $REF_XML_INPUT $SEC_XML_INPUT $REPLACEMENT_AOI $CHANGESET_XML_DEBUG $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+
+  # CHANGESET APPLICATION
+
+  echo ""
+  echo "Applying the changeset: $CHANGESET_XML to the reference data in the osm api db..."
+  echo ""
+  hoot changeset-apply $GENERAL_OPTS $DB_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-apply-xml.osm $CHANGESET_XML $OSM_API_DB_URL
+  echo ""
+  echo "Reading the entire reference dataset out of the osm api db to: $OUT_XML for verification..."
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/final-write-xml.osm $OSM_API_DB_URL $OUT_DIR/$OUT_XML
+  # Not completely sure what the differences between the xml output and db output are yet, but the output maps look identical.
+  hoot diff $GENERAL_OPTS $IN_DIR/$OUT_XML $OUT_DIR/$OUT_XML
+
+fi
+
+# JSON SOURCE WORKFLOW
+
+if [[ $SOURCE_FORMATS == *"json"* ]]; then
+
+  if [ "$PERTURBING_REF" == "true" ]; then
+    REF_JSON_INPUT=$OUT_DIR/ref-perturbed-original.json
+  else
+    REF_JSON_INPUT=$OUT_DIR/ref-original.json
+  fi
+  SEC_JSON_INPUT=$OUT_DIR/sec-original.json
+  CHANGESET_JSON=$OUT_DIR/$TEST_NAME-changeset-json.osc.sql
+  CHANGESET_JSON_DEBUG=$OUT_DIR/$TEST_NAME-changeset-json.osc
+  OUT_JSON=$TEST_NAME-json-replaced.osm
+
+  # DATA PREP
+
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing the reference dataset from: $SOURCE_FILE_1 to an osm api db (contains features to be replaced)..."
+  else
+    echo "Cropping the reference dataset from: $SOURCE_FILE_1 to: $CROP_AOI, then writing it to an osm api db (contains features to be replaced)..."
+  fi
+  echo ""
+  scripts/database/CleanAndInitializeOsmApiDb.sh
+  hoot convert $GENERAL_OPTS $DB_OPTS $CROP_OPTS $PERTY_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref-json.osm -D reader.use.data.source.ids=false -D id.generator=hoot::PositiveIdGenerator -D convert.ops=$REF_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 1" $SOURCE_FILE_1 $REF_DB_INPUT
+  echo ""
+  echo "Writing the reference dataset from the osm api db to a json file: $REF_JSON_INPUT (contains features to be replaced)..."
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-ref-json.osm -D reader.use.data.source.ids=true $REF_DB_INPUT $REF_JSON_INPUT
+  echo ""
+  if [[ "$CROP_OPTS" == "" ]]; then
+    echo "Writing the secondary dataset from: $SOURCE_FILE_2 to a json file: $SEC_JSON_INPUT (contains features to replace with)..."
+  else
+    echo "Cropping the secondary dataset from: $SOURCE_FILE_2 to: $CROP_AOI, then writing it to a json file: $SEC_JSON_INPUT (contains features to replace with)..."
+  fi
+  echo ""
+  hoot convert $GENERAL_OPTS $CROP_OPTS -D debug.maps.filename=$OUT_DIR/data-prep-sec-json.osm -D reader.use.data.source.ids=false -D convert.ops=$SEC_CONVERT_OPS -D set.tag.value.visitor.element.criteria=$TAG_ELEMENT_CRITERIA -D set.tag.value.visitor.keys=$CUSTOM_TAG_KEY -D set.tag.value.visitor.values=$CUSTOM_TAG_VAL" 2" $SOURCE_FILE_2 $SEC_JSON_INPUT
+
+  # CHANGESET DERIVATION
+
+  echo ""
+  echo "Deriving a changeset between $REF_JSON_INPUT and $SEC_JSON_INPUT over: $REPLACEMENT_AOI, to file: $CHANGESET_JSON that replaces features in the reference dataset with those from a secondary dataset..."
+  echo ""
+  hoot changeset-derive-replacement $GENERAL_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-json.osm $REF_JSON_INPUT $SEC_JSON_INPUT $REPLACEMENT_AOI $CHANGESET_JSON $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+  # debug only
+  # hoot changeset-derive-replacement $GENERAL_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-derive-json.osm $REF_JSON_INPUT $SEC_JSON_INPUT $REPLACEMENT_AOI $CHANGESET_JSON_DEBUG $REF_DB_INPUT $FULL_REPLACEMENT $STRICT_BOUNDS $GEOMETRY_FILTERS $REPLACEMENT_FILTERS $CHAIN_REPLACEMENT_FILTERS $REPLACEMENT_FILTER_OPTIONS --write-bounds
+
+  # CHANGESET APPLICATION
+
+  echo ""
+  echo "Applying the changeset: $CHANGESET_JSON to the reference data in the osm api db..."
+  echo ""
+  hoot changeset-apply $GENERAL_OPTS $DB_OPTS $CHANGESET_DERIVE_OPTS -D debug.maps.filename=$OUT_DIR/changeset-apply-json.osm $CHANGESET_JSON $OSM_API_DB_URL
+  echo ""
+  echo "Reading the entire reference dataset out of the osm api db to: $OUT_JSON for verification..."
+  echo ""
+  hoot convert $GENERAL_OPTS $DB_OPTS -D debug.maps.filename=$OUT_DIR/final-write-json.osm $OSM_API_DB_URL $OUT_DIR/$OUT_JSON
+  # json output matches xml output
+  hoot diff $GENERAL_OPTS $IN_DIR/$OUT_XML $OUT_DIR/$OUT_JSON
+
+fi
Clone this wiki locally