diff --git a/Dockerfile.consumer b/Dockerfile.consumer index 28f9033..c71a537 100644 --- a/Dockerfile.consumer +++ b/Dockerfile.consumer @@ -3,7 +3,7 @@ FROM senzing/senzingsdk-runtime:4.0.0 USER root RUN apt-get update \ - && apt-get -y install --no-install-recommends curl python3 python3-pip python3-boto3 \ + && apt-get -y install --no-install-recommends python3 python3-pip python3-boto3 \ && apt-get -y autoremove \ && apt-get -y clean diff --git a/Dockerfile.exporter b/Dockerfile.exporter index 580fa71..8e2de83 100644 --- a/Dockerfile.exporter +++ b/Dockerfile.exporter @@ -3,7 +3,7 @@ FROM senzing/senzingsdk-runtime:4.0.0 USER root RUN apt-get update \ - && apt-get -y install --no-install-recommends curl python3 python3-pip python3-boto3 \ + && apt-get -y install --no-install-recommends python3 python3-pip python3-boto3 \ && apt-get -y autoremove \ && apt-get -y clean diff --git a/Dockerfile.tools b/Dockerfile.tools index 0456250..73b29d2 100644 --- a/Dockerfile.tools +++ b/Dockerfile.tools @@ -9,7 +9,7 @@ RUN echo "deb http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc # Update packages and install additional dependencies. RUN apt-get update && \ apt-get upgrade -y && \ - apt-get install --no-install-recommends -y awscli pipx postgresql-client senzingsdk-poc && \ + apt-get install --no-install-recommends -y awscli pipx postgresql-client senzingsdk-poc python3 python3-pip python3-boto3 && \ apt-get autoremove \ && apt-get clean @@ -30,9 +30,15 @@ USER senzing ENV PATH="$PATH:/home/senzing/.local/bin" RUN pipx install awscli-local +ENV PYTHONPATH=$PYTHONPATH:/home/senzing/dev:/usr/lib/python3/dist-packages + # Define volumes necessary to support a read-only root filesystem on ECS # Fargate. VOLUME ["/home/senzing", "/var/lib/amazon", "/var/log"] WORKDIR /home/senzing + +RUN mkdir -p dev +COPY dev-scripts/* dev + ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md index bcdffeb..91ac412 100644 --- a/README.md +++ b/README.md @@ -51,39 +51,13 @@ and run the consumer service on our local machine. This setup includes: docker compose up -d ``` -### Consumer - -Spinning up a consumer service (intended to be a continually-running process; in -a production scenarion, multiple instances could be running simultaneously as -needed): - - ```bash - docker compose run --env AWS_PROFILE=some-profile-name --env \ - Q_URL="http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/sqs-senzing-local-ingest" \ - consumer - ``` - -### Exporter - -Spinning up the exporter middleware (this is intended to be an ephemeral -container): - - ```bash - docker compose run --env AWS_PROFILE=localstack --env S3_BUCKET_NAME=sqs-senzing-local-export exporter - ``` - -You can view information about files in the Localstack S3 bucket by visiting -this URL: - - http://localhost:4566/sqs-senzing-local-export +### Using the services (tools container) -### Using the services (Tools container) +Access the `tools` container to interact with the services: -1. Access the `tools` container to interact with the services: - - ```bash - docker compose run tools /bin/bash - ``` + ```bash + docker compose run tools /bin/bash + ``` The `tools` container should be configured with the necessary environment variables to interact with the SQS and S3 services in LocalStack, as well as the @@ -116,6 +90,120 @@ sz_command -C add_record \ PEOPLE 1 '{"NAME_FULL":"Robert Smith", "DATE_OF_BIRTH":"7/4/1976", "PHONE_NUMBER":"555-555-2088"}' ``` +#### Loading sample data + +From inside the tools container: + +1. Download the sample data sets; see: +https://senzing.com/docs/quickstart/quickstart_docker/#download-the-files +2. Register the data source names using `sz_configtool`; see: +https://senzing.com/docs/quickstart/quickstart_docker/#add-the-data-source +3. Actually load each of the data files into the Senzing database, i.e.: + + sz_file_loader -f customers.jsonl + sz_file_loader -f reference.jsonl + sz_file_loader -f watchlist.jsonl + +#### Additional utilities + +##### Senzing and the database + +Load a single record as a simple test: + + docker compose run tools python dev/add_1_record.py + +Purge the database: + + docker compose run tools python dev/db_purge.py + +##### S3 + +You might need to configure an AWS profile before using these S3-related +utilities. See further down below for how to do that. + +Copy a file out of the LocalStack S3 bucket into `~/tmp` on your machine (be +sure this folder already exists -- on macOS, that would be +`/Users/yourusername/tmp`): + +> [!NOTE] +> You will need to manually create `/Users/yourusername/tmp` if it +> doesn't already exist. + + # Here, `hemingway.txt` is the file you wish to retrieve from S3. + docker compose run tools python3 dev/s3_get.py hemingway.txt + +Purge the LocalStack S3 bucket: + + docker compose run tools python3 dev/s3_purge.py + +## Middleware + +There are three middleware applications: + +- consumer (continually-running service) +- redoer (continually-running service) +- exporter (ephemeral container) + +### Configuring an AWS profile for LocalStack + +To use the middleware (consumer, etc.) with LocalStack, an AWS profile specific +to LocalStack will be needed. + +Your `~/.aws/config` file should have something like: + + [profile localstack] + region = us-east-1 + output = json + ignore_configure_endpoint_urls = true + endpoint_url = http://localhost:4566 + +Your `~/.aws/credentials` file should have: + + [localstack] + aws_access_key_id=test + aws_secret_access_key=test + +Generally speaking, the `endpoint_url` argument will be needed when +instantiating client objects for use with particular LocalStack services, e.g.: + + sess = boto3.Session() + if 'AWS_ENDPOINT_URL' in os.environ: + return sess.client('s3', endpoint_url=os.environ['AWS_ENDPOINT_URL']) + else: + return sess.client('s3') + +### Consumer + +Spinning up the consumer middleware (intended to be a continually-running +process; in a production scenario, multiple instances could be running +simultaneously as needed): + + ```bash + docker compose run --env AWS_PROFILE=localstack --env \ + Q_URL="http://sqs.us-east-1.localhost.localstack.cloud:4566/000000000000/sqs-senzing-local-ingest" \ + --env LOG_LEVEL=INFO consumer + ``` + +`LOG_LEVEL` is optional; defaults to `INFO`. + +### Exporter + +Spinning up the exporter middleware (this is intended to be an ephemeral +container): + + ```bash + docker compose run --env AWS_PROFILE=localstack --env S3_BUCKET_NAME=sqs-senzing-local-export \ + --env LOG_LEVEL=INFO exporter + ``` + +`LOG_LEVEL` is optional; defaults to `INFO`. + +You can view information about files in the LocalStack S3 bucket by visiting +this URL: + + http://localhost:4566/sqs-senzing-local-export + + [awslocal]: https://docs.localstack.cloud/aws/integrations/aws-native-tools/aws-cli/#localstack-aws-cli-awslocal [localstack]: https://www.localstack.cloud/ [senzing]: https://senzing.com diff --git a/middleware/sz_test.py b/dev-scripts/add_1_record.py similarity index 100% rename from middleware/sz_test.py rename to dev-scripts/add_1_record.py diff --git a/middleware/sz_purge.py b/dev-scripts/db_purge.py similarity index 82% rename from middleware/sz_purge.py rename to dev-scripts/db_purge.py index eb51646..13f2211 100644 --- a/middleware/sz_purge.py +++ b/dev-scripts/db_purge.py @@ -16,9 +16,9 @@ sz_factory = sz_core.SzAbstractFactoryCore("sz_factory_1", senzing_engine_configuration_json) sz_diagnostic = sz_factory.create_diagnostic() -print('Are you sure you want to purge the repository? If so, type YES:') +print('Are you sure you want to purge the database? If so, type YES:') ans = input('>') if ans == 'YES': sz_diagnostic.purge_repository() else: - print('Everything left as-is.') + print('Nothing was done. Everything was left as-is.') diff --git a/dev-scripts/s3_get.py b/dev-scripts/s3_get.py new file mode 100644 index 0000000..492b885 --- /dev/null +++ b/dev-scripts/s3_get.py @@ -0,0 +1,24 @@ +import os +import sys +import boto3 + +def make_s3_client(): + try: + sess = boto3.Session() + return sess.client('s3', endpoint_url=os.environ['AWS_ENDPOINT_URL']) + except Exception as e: + print(e) + sys.exit(1) + +def get_file_from_s3(key): + '''Get file from S3 and write to /tmp (use docker-compose to map this + to desired directory on host machine).''' + s3 = make_s3_client() + print('Grabbing file...') + resp = s3.download_file(os.environ['S3_BUCKET_NAME'], key, '/tmp/'+key) + print ('Got file, put in tmp') + +print("Starting util_s3_retrieve ...") +fname = sys.argv[1] +get_file_from_s3(fname) +print("Done") diff --git a/dev-scripts/s3_purge.py b/dev-scripts/s3_purge.py new file mode 100644 index 0000000..45bcab8 --- /dev/null +++ b/dev-scripts/s3_purge.py @@ -0,0 +1,16 @@ +import os +import boto3 + +def purge_s3(): + s3 = boto3.resource('s3', endpoint_url=os.environ['AWS_ENDPOINT_URL']) + buck = s3.Bucket(os.environ['S3_BUCKET_NAME']) + print('Purging...') + buck.objects.all().delete() + +print('Are you sure you want to purge the S3 bucket (' + os.environ['S3_BUCKET_NAME'] + ')? If so, type YES:') +ans = input('>') +if ans == 'YES': + purge_s3() + print('Done.') +else: + print('Nothing was done. Everything was left as-is.') diff --git a/docker-compose.yaml b/docker-compose.yaml index f923001..5b229d6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -75,6 +75,13 @@ services: "CONNECTION": "postgresql://${POSTGRES_USERNAME:-senzing}:${POSTGRES_PASSWORD:-senzing}@db:5432:${POSTGRES_DB:-G2}/?sslmode=disable" } } + AWS_PROFILE: localstack + S3_BUCKET_NAME: sqs-senzing-local-export + PYTHONPATH: ${PYTHONPATH}:/opt/senzing/er/sdk/python:/home/senzing/dev:/usr/lib/python3/dist-packages + PYTHONUNBUFFERED: 1 # Flush buffer - helps with print statements. + volumes: + - ~/tmp:/tmp + - ~/.aws:/home/senzing/.aws consumer: build: diff --git a/middleware/consumer.py b/middleware/consumer.py index 488fd74..07b1caa 100644 --- a/middleware/consumer.py +++ b/middleware/consumer.py @@ -51,9 +51,10 @@ def init(): '''Returns sqs client object''' try: sess = _make_boto_session() - sqs = sess.client('sqs') - log.info(AWS_TAG + 'SQS client object instantiated.') - return sqs + if 'AWS_ENDPOINT_URL' in os.environ: + return sess.client('sqs', endpoint_url=os.environ['AWS_ENDPOINT_URL']) + else: + return sess.client('sqs') except Exception as e: log.error(AWS_TAG + str(e)) sys.exit(1) @@ -66,9 +67,8 @@ def get_msgs(sqs, q_url): - Body -- here, should be the JSONL record as a string ''' while 1: - print('waiting for msg') try: - log.info(AWS_TAG + 'Polling SQS for the next message') + log.debug(AWS_TAG + 'Polling SQS for the next message') resp = sqs.receive_message(QueueUrl=q_url, MaxNumberOfMessages=1, WaitTimeSeconds=POLL_SECONDS) if 'Messages' in resp and len(resp['Messages']) == 1: @@ -155,7 +155,7 @@ def go(): # Get next message. msg = next(msgs) receipt_handle, body = msg['ReceiptHandle'], msg['Body'] - log.info('SQS message retrieved, having ReceiptHandle: ' + log.debug('SQS message retrieved, having ReceiptHandle: ' + receipt_handle) rcd = json.loads(body) diff --git a/middleware/exporter.py b/middleware/exporter.py index 6b29fc4..98459cc 100644 --- a/middleware/exporter.py +++ b/middleware/exporter.py @@ -128,23 +128,3 @@ def main(): if __name__ == '__main__': main() -#------------------------------------------------------------------------------- -# ad-hoc test funcs - might move later - -def _upload_test_file_to_s3(): - print("Starting test upload to S3 ...") - s3 = make_s3_client() - print(s3) - fname = 'hemingway.txt' - resp = s3.upload_file(fname, S3_BUCKET_NAME, fname) - print(resp) - print('Upload successful.') - -def _get_file_from_s3(key): - '''Get file from S3 and write to /tmp (use docker-compose to map this - to desired directory on host machine).''' - print('Grabbing file...') - s3 = make_s3_client() - resp = s3.download_file(S3_BUCKET_NAME, key, '/tmp/'+key) - print(resp) - print('Done.') diff --git a/middleware/loglib.py b/middleware/loglib.py index c7381aa..f582866 100644 --- a/middleware/loglib.py +++ b/middleware/loglib.py @@ -1,4 +1,5 @@ import logging +import os import sys AWS_TAG = '[AWS] ' @@ -7,13 +8,15 @@ _instantiated_loggers = {} +LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO') + def retrieve_logger(tag='default'): global _instantiated_loggers if tag in _instantiated_loggers: return _instantiated_loggers[tag] else: x = logging.getLogger(tag) - x.setLevel(logging.INFO) + x.setLevel(LOG_LEVEL) handler = logging.StreamHandler() fmt = logging.Formatter( '[%(asctime)s] [%(levelname)s] ' \ diff --git a/middleware/sample-data/customers.jsonl b/middleware/sample-data/customers.jsonl deleted file mode 100644 index a8a583e..0000000 --- a/middleware/sample-data/customers.jsonl +++ /dev/null @@ -1,120 +0,0 @@ -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1001", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Robert", "DATE_OF_BIRTH": "12/11/1978", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "123 Main Street, Las Vegas NV 89132", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "702-919-1300", "EMAIL_ADDRESS": "bsmith@work.com", "DATE": "1/2/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1002", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Bob", "DATE_OF_BIRTH": "11/12/1978", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1515 Adela Lane", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89111", "PHONE_TYPE": "MOBILE", "PHONE_NUMBER": "702-919-1300", "DATE": "3/10/17", "STATUS": "Inactive", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1003", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Bob", "PRIMARY_NAME_MIDDLE": "J", "DATE_OF_BIRTH": "12/11/1978", "EMAIL_ADDRESS": "bsmith@work.com", "DATE": "4/9/16", "STATUS": "Inactive", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1004", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "B", "DATE_OF_BIRTH": "11/12/1979", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1515 Adela Ln", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89132", "EMAIL_ADDRESS": "bsmith@work.com", "DATE": "1/5/15", "STATUS": "Inactive", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1005", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Robbie", "DRIVERS_LICENSE_NUMBER": "112233", "DRIVERS_LICENSE_STATE": "NV", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "123 E Main St", "ADDR_CITY": "Henderson", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89132", "DATE": "7/16/19", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1009", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Edward", "DATE_OF_BIRTH": "3/1/1970", "SSN_NUMBER": "294-66-9999", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_CITY": "Blacklick", "ADDR_STATE": "OH", "ADDR_POSTAL_CODE": "43004", "EMAIL_ADDRESS": "Kusha123@hmail.com", "DATE": "1/7/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1010", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Eddie", "DATE_OF_BIRTH": "Mar 1 1970", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_CITY": "Blacklick", "ADDR_STATE": "OHIO", "DATE": "1/8/16", "STATUS": "Inactive", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1011", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Knight", "PRIMARY_NAME_FIRST": "Ed", "DATE_OF_BIRTH": "3/1/70", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1602 Brenville Pl", "ADDR_CITY": "San Francisco", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "94105", "DATE": "10/9/15", "STATUS": "Terminated", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1015", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Mary ", "DATE_OF_BIRTH": "10/27/76", "SSN_NUMBER": "293-90-9090", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_CITY": "Blacklick", "ADDR_STATE": "OH", "ADDR_POSTAL_CODE": "43004", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "512-353-8633", "EMAIL_ADDRESS": "Kusha123@hmail.com", "DATE": "1/10/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1016", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Marie", "DATE_OF_BIRTH": "10/27/76", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_POSTAL_CODE": "43004", "DATE": "1/11/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1017", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Mary ", "SSN_NUMBER": "293-90-9090", "DATE": "1/12/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1018", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Marie", "DATE_OF_BIRTH": "10/28/76", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "512-353-8633", "DATE": "1/13/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1019", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Mark", "DATE_OF_BIRTH": "9/28/97", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_CITY": "Blacklick", "ADDR_STATE": "OH", "ADDR_POSTAL_CODE": "43004", "EMAIL_ADDRESS": "Kusha123@hmail.com", "DATE": "1/14/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1020", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kusha", "PRIMARY_NAME_FIRST": "Marsha", "DATE_OF_BIRTH": "9/28/97", "SSN_NUMBER": "201-77-7719", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1304 Poppy Hills Dr", "ADDR_CITY": "Blacklick", "ADDR_STATE": "OH", "ADDR_POSTAL_CODE": "43004", "EMAIL_ADDRESS": "Kusha123@hmail.com", "DATE": "1/15/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1022", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Antoun", "PRIMARY_NAME_FIRST": "Mohamed", "DATE_OF_BIRTH": "1/7/80", "DATE": "1/16/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1023", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Antoun", "PRIMARY_NAME_FIRST": "Muhammed", "DATE_OF_BIRTH": "1/7/80", "DATE": "1/17/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1025", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Darla", "DATE_OF_BIRTH": "1/7/80", "DATE": "1/18/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1026", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Darlene", "DATE_OF_BIRTH": "1/7/80", "DATE": "1/19/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1028", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Dobbins Jr", "PRIMARY_NAME_FIRST": "David", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "1450 N City Rd Suite 900", "ADDR_CITY": "Arlington", "ADDR_STATE": "VA", "ADDR_POSTAL_CODE": "23208", "DATE": "1/20/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1030", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Garski", "PRIMARY_NAME_FIRST": "Luis", "DATE_OF_BIRTH": "3/25/89", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "445 Overpass Rd ", "ADDR_CITY": "San Ramon ", "ADDR_STATE": "CA ", "ADDR_POSTAL_CODE": "927230000", "DATE": "1/21/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1031", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Garsky", "PRIMARY_NAME_FIRST": "Louis", "DATE_OF_BIRTH": "3/25/89", "ADDR_TYPE": "HOME", "ADDR_LINE1": "445 Overpass Rd San Ramon", "DATE": "1/22/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1032", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Shaw", "PRIMARY_NAME_FIRST": "Daniella", "DATE_OF_BIRTH": "20/8/1991", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "202-321-3212", "DATE": "1/23/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1033", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Daniella", "PRIMARY_NAME_FIRST": "Shaw", "DATE_OF_BIRTH": "8/20/91", "ADDR_TYPE": "HOME", "ADDR_LINE1": "80 Delaware Ave SE Washington DC 40040", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "321-3212", "DATE": "1/24/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1034", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Medina Sentosa", "PRIMARY_NAME_FIRST": "Maria Luis", "DATE_OF_BIRTH": "11/21/73", "ADDR_TYPE": "HOME", "ADDR_LINE1": "9304 W. 15th St La Blanca, FL 60527", "EMAIL_ADDRESS": "Maria Sentosa", "DATE": "1/25/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1035", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "M Sentosa", "PRIMARY_NAME_FIRST": "Maria Luis", "DATE_OF_BIRTH": "11/12/73", "ADDR_TYPE": "HOME", "ADDR_LINE1": "9304 W. 15th St La Blanca, FL 60527", "DATE": "1/26/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1036", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Sentosa", "PRIMARY_NAME_FIRST": "Maria Luis", "DATE_OF_BIRTH": "11/12/73", "ADDR_TYPE": "HOME", "ADDR_LINE1": "9304 W. 15th St La Blanca, FL 60527", "DATE": "1/27/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1039", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "John", "GENDER": "M", "DATE_OF_BIRTH": "10/10/70", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/28/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1040", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "John", "DATE_OF_BIRTH": "3/15/90", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/29/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1043", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Patrick", "DATE_OF_BIRTH": "10/10/70", "PASSPORT_NUMBER": "10251111", "PASSPORT_COUNTRY": "US", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/30/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1044", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Patricia", "DATE_OF_BIRTH": "3/15/90", "PASSPORT_NUMBER": "10252222", "PASSPORT_COUNTRY": "US", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/31/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1045", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Pat", "PASSPORT_NUMBER": "10251111", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/2/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1046", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Pat", "PASSPORT_NUMBER": "10252222", "PASSPORT_COUNTRY": "USA", "ADDR_TYPE": "HOME", "ADDR_LINE1": "3212 W. 32nd St Palm Harbor, FL 60527", "DATE": "1/3/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1047", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Thompson", "PRIMARY_NAME_FIRST": "Zara", "EMAIL_ADDRESS": "sthomp45@fmail.com", "DATE": "1/4/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1048", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Tompson", "PRIMARY_NAME_FIRST": "Sarah", "EMAIL_ADDRESS": "sthomp45@fmail.com", "DATE": "1/5/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1049", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Thompson", "PRIMARY_NAME_FIRST": "Sahra", "EMAIL_ADDRESS": "sthomp45@fmail.com", "DATE": "1/6/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1050", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Toulouse", "PRIMARY_NAME_FIRST": "Lee", "DATE_OF_BIRTH": "2/1/85", "PASSPORT_NUMBER": "483290175", "PASSPORT_COUNTRY": "USA", "DATE": "1/7/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1051", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Toulouse", "PRIMARY_NAME_FIRST": "Leigh", "DATE_OF_BIRTH": "1/2/85", "PASSPORT_NUMBER": "483290175", "PASSPORT_COUNTRY": "US", "DATE": "1/8/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1052", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Toulouse", "PRIMARY_NAME_FIRST": "Lea", "PASSPORT_NUMBER": "483290175", "PASSPORT_COUNTRY": "US", "DATE": "1/9/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1053", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Beau", "PASSPORT_NUMBER": "72129291", "PASSPORT_COUNTRY": "CA", "ADDR_TYPE": "HOME", "ADDR_LINE1": "6371 E Foothill Dr, Orroville, CA ", "DATE": "1/10/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1054", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Smith", "PRIMARY_NAME_FIRST": "Magdalena", "DATE_OF_BIRTH": "24-May-11", "DRIVERS_LICENSE_NUMBER": "93939211", "DRIVERS_LICENSE_STATE": "CA", "ADDR_TYPE": "HOME", "ADDR_LINE1": "6371 E Foothill Dr, Orroville, CA 95915", "DATE": "1/11/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1055", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_FIRST": "Beau", "PASSPORT_NUMBER": "72129291", "PASSPORT_COUNTRY": "CAN", "ADDR_TYPE": "HOME", "ADDR_LINE1": "6371 E Foothill Dr, 95915", "DATE": "1/12/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1056", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Jones", "PRIMARY_NAME_FIRST": "Magdalena", "DATE_OF_BIRTH": "5/24/11", "DRIVERS_LICENSE_NUMBER": "93939211", "DRIVERS_LICENSE_STATE": "CA", "ADDR_TYPE": "HOME", "ADDR_LINE1": "6371 E Foothill Dr, Orroville, CA ", "DATE": "1/13/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1057", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Jones", "PRIMARY_NAME_FIRST": "Jay", "EMAIL_ADDRESS": "jjones@jones.com", "DATE": "1/14/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1058", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Jay", "PRIMARY_NAME_FIRST": "Jones", "EMAIL_ADDRESS": "\"Jay Jones\" ", "DATE": "1/15/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1059", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Roderick", "PRIMARY_NAME_FIRST": "Ray", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "971-421-8250", "DATE": "1/16/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1060", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Roderick", "PRIMARY_NAME_FIRST": "R", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "9714218250", "DATE": "1/17/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1061", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Andreason", "PHONE_TYPE": "MOBILE", "PHONE_NUMBER": "(807) 422-9031", "DATE": "1/18/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1062", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Andreason", "PHONE_NUMBER": "807-422-9031", "DATE": "1/19/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1063", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Mooney", "PRIMARY_NAME_FIRST": "Susan", "DATE_OF_BIRTH": "6/15/98", "DATE": "1/20/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1064", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Mooney", "PRIMARY_NAME_FIRST": "Susanne", "DATE_OF_BIRTH": "6/15/98", "PASSPORT_NUMBER": "1231345345", "PASSPORT_COUNTRY": "US", "DATE": "1/21/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1065", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Mooney", "PRIMARY_NAME_FIRST": "Susan", "PASSPORT_NUMBER": "1231345345", "PASSPORT_COUNTRY": "US", "DRIVERS_LICENSE_NUMBER": "8923322", "DRIVERS_LICENSE_STATE": "OR", "DATE": "1/22/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1066", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Mooney", "PRIMARY_NAME_FIRST": "Susan", "DRIVERS_LICENSE_NUMBER": "8923322", "DRIVERS_LICENSE_STATE": "OR", "SSN_NUMBER": "521-21-2123", "DATE": "1/23/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1067", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Moonie", "PRIMARY_NAME_FIRST": "Susan", "SSN_NUMBER": "521212123", "ADDR_TYPE": "HOME", "ADDR_LINE1": "638 Downey St, Salem, OR", "DATE": "1/24/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1068", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Moony", "PRIMARY_NAME_FIRST": "Susan", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "Adventura Aparments 638 Downey St, Salem, OR", "DATE": "1/25/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1069", "RECORD_TYPE": "PERSON", "NATIVE_NAME_FULL": "\u738b\u6770", "GENDER": "M", "DATE_OF_BIRTH": "9/14/93", "NATIONAL_ID_NUMBER": "832721", "ADDR_TYPE": "HOME", "ADDR_LINE1": "12 Constitution Street ", "DATE": "1/26/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1070", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Wang", "PRIMARY_NAME_FIRST": "Jie", "GENDER": "Male", "DATE_OF_BIRTH": "9/14/93", "NATIONAL_ID_NUMBER": "832721", "NATIONAL_ID_COUNTRY": "Hong Kong", "ADDR_TYPE": "HOME", "ADDR_LINE1": "12 Constitution Street ", "DATE": "1/27/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1071", "RECORD_TYPE": "PERSON", "NATIVE_NAME_FULL": "\u738b\u4f1f", "GENDER": "F", "DATE_OF_BIRTH": "9/14/97", "NATIONAL_ID_NUMBER": "7123833", "NATIONAL_ID_COUNTRY": "China", "ADDR_TYPE": "HOME", "ADDR_LINE1": "169 3rd Ave. Camden, NJ 08030", "DATE": "1/28/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1072", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Wang", "PRIMARY_NAME_FIRST": "Wei", "GENDER": "Female", "DATE_OF_BIRTH": "9/14/97", "NATIONAL_ID_NUMBER": "7123833", "NATIONAL_ID_COUNTRY": "China", "ADDR_TYPE": "HOME", "ADDR_LINE1": "169 3rd Ave. Camden, NJ 08030", "DATE": "1/29/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1073", "RECORD_TYPE": "PERSON", "NATIVE_NAME_FULL": "\u5f20\u4f1f", "GENDER": "M", "DATE_OF_BIRTH": "8/2/06", "ADDR_TYPE": "HOME", "ADDR_LINE1": "173 John Lane, Camden, NJ 08030", "DATE": "1/30/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1074", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Zhang", "PRIMARY_NAME_FIRST": "Wei", "GENDER": "Male", "DATE_OF_BIRTH": "2/8/06", "ADDR_TYPE": "HOME", "ADDR_LINE1": "173 John Lane, 08030", "DATE": "1/31/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1075", "RECORD_TYPE": "PERSON", "NATIVE_NAME_FULL": "\u5f20\u79c0\u82f1", "GENDER": "F", "DATE_OF_BIRTH": "2/4/31", "ADDR_TYPE": "HOME", "ADDR_LINE1": "329 Leatherwood Street, Las Vegas, 89117", "DATE": "1/2/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1076", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Zhang", "PRIMARY_NAME_FIRST": "Xiu Ying", "GENDER": "Female", "DATE_OF_BIRTH": "4/2/31", "ADDR_TYPE": "HOME", "ADDR_LINE1": "329 Leatherwood Street, Las Vegas, NV", "DATE": "1/3/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1077", "RECORD_TYPE": "PERSON", "NATIVE_NAME_FULL": "\u5218\u6770", "GENDER": "F", "DATE_OF_BIRTH": "6/25/08", "ADDR_TYPE": "HOME", "ADDR_LINE1": "37 Campfire St. ", "DATE": "1/4/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1078", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Liu", "PRIMARY_NAME_FIRST": "Jie", "GENDER": "Unknown", "DATE_OF_BIRTH": "25-Jun-08", "ADDR_TYPE": "HOME", "ADDR_LINE1": "37 Campfire St. ", "DATE": "1/5/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1079", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Brown", "PRIMARY_NAME_FIRST": "Jeffrey", "GENDER": "U", "DATE_OF_BIRTH": "6/21/82", "SSN_NUMBER": "3241", "DATE": "1/6/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1080", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Brown Jr", "PRIMARY_NAME_FIRST": "Geoffrey", "GENDER": "M", "DATE_OF_BIRTH": "6/21/82", "SSN_NUMBER": "3241", "DATE": "1/7/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1081", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Frankens", "PRIMARY_NAME_FIRST": "George", "DATE_OF_BIRTH": "15-Mar-92", "PASSPORT_NUMBER": "234456456", "PASSPORT_COUNTRY": "DE", "ADDR_TYPE": "HOME", "ADDR_LINE1": "Ansbacher Strasse 23, 56422 Dusseldorf", "ADDR_POSTAL_CODE": "56244", "DATE": "1/8/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1082", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Frankens", "PRIMARY_NAME_FIRST": "Georg", "DATE_OF_BIRTH": "15-Mar-92", "PASSPORT_NUMBER": "234456456", "PASSPORT_COUNTRY": "Germany", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "23 Ansbacher Street", "ADDR_CITY": "Dusseldorf", "ADDR_POSTAL_CODE": "56244", "ADDR_COUNTRY": "Germany", "DATE": "1/9/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1083", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Klempski", "PRIMARY_NAME_FIRST": "Morris", "DATE_OF_BIRTH": "17-May-90", "PASSPORT_NUMBER": "34543555", "PASSPORT_COUNTRY": "CA", "ADDR_TYPE": "HOME", "ADDR_LINE1": "Skyline Apartments, 705 Sheppard Ave", "ADDR_CITY": "Toronto", "ADDR_POSTAL_CODE": "M1S 1T4", "DATE": "1/10/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1084", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Klempsky", "PRIMARY_NAME_FIRST": "Morrie", "DATE_OF_BIRTH": "17-May-90", "PASSPORT_NUMBER": "34543555", "PASSPORT_COUNTRY": "Canada", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "705 Sheppard Ave", "ADDR_CITY": "Toronto", "ADDR_POSTAL_CODE": "M1S 1T4", "ADDR_COUNTRY": "CAN", "DATE": "1/11/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1085", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "D'esquire", "PRIMARY_NAME_FIRST": "Ellie", "DATE_OF_BIRTH": "19-Feb-91", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "0352 6553537", "EMAIL_ADDRESS": "dellie@fmail.com", "DATE": "1/12/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1086", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Desqueir", "PRIMARY_NAME_FIRST": "Ellie", "DATE_OF_BIRTH": "19-Feb-91", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "+39 0352 6553537", "EMAIL_ADDRESS": "dellie@fmail.com", "DATE": "1/13/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1087", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Wiest", "PRIMARY_NAME_FIRST": "George", "GENDER": "M", "DATE_OF_BIRTH": "3/12/87", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "702-221-2412", "EMAIL_ADDRESS": "pfranks@ishmail.com", "DATE": "1/14/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1088", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Weest", "PRIMARY_NAME_FIRST": "George", "GENDER": "F", "DATE_OF_BIRTH": "3/12/87", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "221-2412", "EMAIL_ADDRESS": "pfranks@ishmail.com", "DATE": "1/15/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1089", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Klein", "PRIMARY_NAME_FIRST": "Morris I", "DATE_OF_BIRTH": "4/12/82", "DATE": "1/16/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1090", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Klein", "PRIMARY_NAME_FIRST": "Morris II", "DATE_OF_BIRTH": "4/12/82", "DATE": "1/17/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1091", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Ohare", "PRIMARY_NAME_FIRST": "Ellie", "DATE_OF_BIRTH": "8/15/67", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "0352 6553537", "EMAIL_ADDRESS": "ellie.ohare@fmail.com", "DATE": "1/18/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1092", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "O'hare", "PRIMARY_NAME_FIRST": "Ellie", "DATE_OF_BIRTH": "8/15/67", "PHONE_TYPE": "HOME", "PHONE_NUMBER": "+39 0352 6553537", "EMAIL_ADDRESS": "ellie.ohare@fmail.com", "DATE": "1/19/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1093", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Amanda", "DATE_OF_BIRTH": "3/12/87", "DRIVERS_LICENSE_NUMBER": "73423499", "DRIVERS_LICENSE_STATE": "MN", "DATE": "1/20/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1094", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Jones", "PRIMARY_NAME_FIRST": "Amanda", "DATE_OF_BIRTH": "3/12/87", "DRIVERS_LICENSE_NUMBER": "73423499", "DRIVERS_LICENSE_STATE": "MN", "DATE": "1/21/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1095", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Aguilar", "PRIMARY_NAME_FIRST": "Juan", "GENDER": "Male", "DATE_OF_BIRTH": "4/12/82", "DRIVERS_LICENSE_NUMBER": "234234455", "DRIVERS_LICENSE_STATE": "MN", "DATE": "1/22/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1096", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Aguilar", "PRIMARY_NAME_FIRST": "Juann", "DATE_OF_BIRTH": "4/12/82", "DRIVERS_LICENSE_NUMBER": "234234455", "DRIVERS_LICENSE_STATE": "MN", "DATE": "1/23/18", "STATUS": "Active", "AMOUNT": "100"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1097", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Sanchez", "PRIMARY_NAME_FIRST": "Marie", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "P.O. Box 12987", "ADDR_CITY": "Andersonville", "ADDR_STATE": "IL", "ADDR_POSTAL_CODE": "60611", "PHONE_TYPE": "MOBILE", "EMAIL_ADDRESS": "mickey@mmail.com", "DATE": "1/24/18", "STATUS": "Active", "AMOUNT": "200"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1098", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Sanchez Mendoza", "PRIMARY_NAME_FIRST": "Marie", "ADDR_TYPE": "MAILING", "ADDR_LINE1": "PO BOX 12987", "ADDR_CITY": "Chicago", "ADDR_STATE": "IL", "ADDR_POSTAL_CODE": "60611", "PHONE_TYPE": "MOBILE", "EMAIL_ADDRESS": "mickey@mmail.com", "DATE": "1/25/18", "STATUS": "Active", "AMOUNT": "300"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1099", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Aguilar", "PRIMARY_NAME_FIRST": "Anna Maria", "GENDER": "Female", "ADDR_TYPE": "HOME", "ADDR_LINE1": "1812 Overture way", "ADDR_CITY": "Chicago", "ADDR_STATE": "IL", "PHONE_TYPE": "MOBILE", "EMAIL_ADDRESS": "mouse@mmail.com", "DATE": "1/26/18", "STATUS": "Active", "AMOUNT": "400"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1100", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Aguilar", "PRIMARY_NAME_FIRST": "Anna", "PRIMARY_NAME_MIDDLE": "Marie", "GENDER": "Unknown", "ADDR_TYPE": "HOME", "ADDR_LINE1": "9881 Freedom way", "ADDR_CITY": "Chicago", "ADDR_STATE": "IL", "PHONE_TYPE": "MOBILE", "EMAIL_ADDRESS": "mouse@mmail.com", "DATE": "1/27/18", "STATUS": "Active", "AMOUNT": "500"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1101", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Miller", "PRIMARY_NAME_FIRST": "Mark", "EMAIL_ADDRESS": "mark@marksfoods.com", "DATE": "1/28/18", "STATUS": "Active", "AMOUNT": "600"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1102", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Milner", "PRIMARY_NAME_FIRST": "Mark", "EMAIL_ADDRESS": "mark@marksfoods.com", "DATE": "1/29/18", "STATUS": "Active", "AMOUNT": "700"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1103", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Becker", "PRIMARY_NAME_FIRST": "Anabella", "GENDER": "U", "DRIVERS_LICENSE_NUMBER": "823123", "DRIVERS_LICENSE_STATE": "TX", "DATE": "1/30/18", "STATUS": "Active", "AMOUNT": "800"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "1104", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Becker", "PRIMARY_NAME_FIRST": "Annabelle", "GENDER": "F", "DRIVERS_LICENSE_NUMBER": "823123", "DRIVERS_LICENSE_STATE": "Texas", "DATE": "1/31/18", "STATUS": "Active", "AMOUNT": "900"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2011", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "Hajah Mamunah (Jln Pisang)", "ADDR_TYPE": "BUSINESS", "ADDR_FULL": "#01-11, HillV2, 4 Hillview Rise, 667979", "ADDR_COUNTRY": "Singapore", "DATE": "1/31/18", "STATUS": "Inactive", "CATEGORY": "Platinum"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2031", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "\u1782\u17b9\u1798", "PRIMARY_NAME_FIRST": "\u178f\u17b6\u179a\u17b6", "ADDR_TYPE": "PRIMARY", "ADDR_FULL": "Street 128 Phnom Penh Cambodia", "DATE": "3/15/1992", "STATUS": "Active", "CATEGORY": "Gold"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2032", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kim", "PRIMARY_NAME_FIRST": "Dara", "ADDR_TYPE": "PRIMARY", "ADDR_LINE1": "Street 128 ", "ADDR_CITY": "Phnom Penh", "ADDR_COUNTRY": "Cambodia", "DATE": "3/12/1998", "STATUS": "Active", "CATEGORY": "Silver"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2042", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "Mullenkrants ", "SECONDARY_NAME_ORG": "Autoworks", "ADDR_TYPE": "PRIMARY", "ADDR_LINE1": "Hardenbergstrasse 87", "ADDR_POSTAL_CODE": "66879", "ADDR_COUNTRY": "Germany", "DATE": "3/15/2019", "STATUS": "Terminated", "CATEGORY": "Platinum"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2063", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_FULL": "Alexander Pavlovich Vasiliev", "PHONE_NUMBER": "481-285-6234", "DATE": "1/15/2000", "STATUS": "Active", "CATEGORY": "Platinum"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2072", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "Univrsl Export Inc", "ADDR_TYPE": "BUSINESS", "ADDR_LINE1": "100 Howard Hughs Plaza", "ADDR_CITY": "Las Vegas", "ADDR_STATE": "NV", "ADDR_POSTAL_CODE": "89111", "PHONE_NUMBER": "800-111-1234", "DATE": "6/15/2005", "STATUS": "Active", "CATEGORY": "Silver"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2073", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "Worldwide Exports ", "ADDR_TYPE": "REGISTERED", "ADDR_LINE1": "Chrysler Building, 405 Lexington Avenue", "ADDR_CITY": "New York", "ADDR_STATE": "NY", "ADDR_POSTAL_CODE": "10174", "DATE": "12/10/2020", "STATUS": "Active", "CATEGORY": "Platinum"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2142", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "Singapore exports", "ADDR_TYPE": "PRIMARY", "ADDR_FULL": "133 New Bridge Road, Chinatown Point, Singapore 059413", "ADDR_COUNTRY": "Singapore", "DATE": "2/4/2012", "STATUS": "Active", "CATEGORY": "Silver"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2152", "RECORD_TYPE": "ORGANIZATION", "PRIMARY_NAME_ORG": "India Exports", "ADDR_TYPE": "PRIMARY", "ADDR_FULL": "Mullanpara Road, Old Vythiri, Vythiri, Wayanad, 673576, India", "DATE": "3/1/2010", "STATUS": "Active", "CATEGORY": "Gold"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2171", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Andrew", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2172", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Andy ", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2181", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Anna", "PHONE_NUMBER": "702-221-2211", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2182", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Anderson", "PRIMARY_NAME_FIRST": "Annabelle", "PHONE_NUMBER": "702-221-2211", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2191", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Muir", "PRIMARY_NAME_FIRST": "Jim", "DATE_OF_BIRTH": "1997-11-12", "ADDR_LINE1": "12396 Austin Rd", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2192", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Muir", "PRIMARY_NAME_FIRST": "Jane", "DATE_OF_BIRTH": "1999-12-10", "ADDR_LINE1": "12396 Austin Rd", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2193", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Muir", "PRIMARY_NAME_FIRST": "J", "DATE_OF_BIRTH": "1999-12-10", "ADDR_LINE1": "12396 Austin Rd", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2201", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Swarm", "PRIMARY_NAME_FIRST": "Jorg", "ADDR_LINE1": "127 14th Ave", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2202", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Barge", "PRIMARY_NAME_FIRST": "Jorge", "ADDR_LINE1": "4362 Belmont Lane", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2203", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Gray", "PRIMARY_NAME_FIRST": "Gaston", "ADDR_LINE1": "1376 BlueBell Road", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2204", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Howard", "PRIMARY_NAME_FIRST": "Henry", "ADDR_LINE1": "538 Blanco St", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2205", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Inverness", "PRIMARY_NAME_FIRST": "Inez", "ADDR_LINE1": "2516 BentTree Ln", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2206", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Jackson", "PRIMARY_NAME_FIRST": "Julia", "ADDR_LINE1": "319 Cody Road", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2207", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kellar", "PRIMARY_NAME_FIRST": "Kandace", "ADDR_LINE1": "1824 AspenOak Way", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2208", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Leonard", "PRIMARY_NAME_FIRST": "Leslie", "ADDR_LINE1": "4362 Belmont Lane", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2209", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Miller", "PRIMARY_NAME_FIRST": "Millie", "ADDR_LINE1": "1376 BlueBell Road", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2210", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Nice", "PRIMARY_NAME_FIRST": "Nelson", "ADDR_LINE1": "319 Cody Road", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2211", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Otter", "PRIMARY_NAME_FIRST": "Otto", "ADDR_LINE1": "1824 AspenOak Way", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2212", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Pemberton", "PRIMARY_NAME_FIRST": "Penny", "ADDR_LINE1": "1824 AspenOak Way", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2213", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Kellar", "PRIMARY_NAME_FIRST": "Candace", "ADDR_LINE1": "1824 AspenOak Way", "ADDR_CITY": "Elmwood Park", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95865", "EMAIL_ADDRESS": "info@ca-state.gov"} -{"DATA_SOURCE": "CUSTOMERS", "RECORD_ID": "2214", "RECORD_TYPE": "PERSON", "PRIMARY_NAME_LAST": "Sanders", "PRIMARY_NAME_FIRST": "Sandy", "ADDR_LINE1": "1376 BlueBell Rd", "ADDR_CITY": "Sacramento", "ADDR_STATE": "CA", "ADDR_POSTAL_CODE": "95823", "EMAIL_ADDRESS": "info@ca-state.gov"} diff --git a/middleware/sample-data/hemingway.txt b/middleware/sample-data/hemingway.txt deleted file mode 100644 index 95a12f8..0000000 --- a/middleware/sample-data/hemingway.txt +++ /dev/null @@ -1,7 +0,0 @@ -It was very late and everyone had left the cafe except an old man who sat in the -shadow the leaves of the tree made against the electric light. In the day time the -street was dusty, but at night the dew settled the dust and the old man liked to sit -late because he was deaf and now at night it was quiet and he felt the difference. -The two waiters inside the cafe knew that the old man was a little drunk, and while -he was a good client they knew that if he became too drunk he would leave without -paying, so they kept watch on him. diff --git a/middleware/testutils.py b/middleware/testutils.py deleted file mode 100644 index 896032e..0000000 --- a/middleware/testutils.py +++ /dev/null @@ -1,73 +0,0 @@ -import json -import sys -import time -import boto3 - -# Primary function of interest here is load_dat(), which loads data from -# sample-data/customers.jsonl into SQS. - -# Suggestion: set custom values for these in a REPL. -AWS_PROFILE_NAME = None -Q_URL = None - -#------------------------------------------------------------------------------ - -def make_boto_session(fpath=None): - '''fpath is path to json file with keys: - - aws_access_key_id - - aws_secret_access_key - - aws_session_token - - region - (Same keys should typically be present in .aws/credentials file - if using profile.)''' - if fpath: - return boto3.Session(**json.load(open(fpath))) - else: - return boto3.Session(profile_name=AWS_PROFILE_NAME) - -def make_sqs_client(boto_session): - return boto_session.client('sqs') - -def init(): - sess = make_boto_session() - sqs = sess.client('sqs') - return sqs - -def make_q(name): - sqs = init() - # defaults: standard, 30 visibility timeout - return sqs.create_queue(QueueName=name) - -#------------------------------------------------------------------------------ - -def slurp_cust_data(): - fname = 'sample-data/customers.jsonl' - f = open(fname) - return list(map(json.loads, f.readlines())) - -#------------------------------------------------------------------------------ - -def send_rcd_to_q(rcd, sqs, q_url): - # TEMP - #time.sleep(1) - print(rcd) - - pyld = json.dumps(rcd) - resp = sqs.send_message(QueueUrl=q_url, MessageBody=pyld) - return resp - -def empty_q(sqs, q_url): - return sqs.purge_queue(QueueUrl=q_url) - -def load_dat(): - '''Load some test data into SQS.''' - sqs = init() - dat = slurp_cust_data() - return [send_rcd_to_q(r, sqs, Q_URL) for r in dat] - -def _get_1_msg(sqs, q_url): - resp = sqs.receive_message(QueueUrl=q_url, MaxNumberOfMessages=1, - WaitTimeSeconds=POLL_SECONDS) - print(resp) - return resp -