GET or POST /search requests

GET

Use get_search.py to test GET requests with /search. This script saves results and match count to a file.

Figure 1. get_search.py
#!/usr/bin/env python
#
# Copyright 2017 Voci Technologies  All rights reserved.
# Unsupported example code - Not for production use.
#

import requests
import json
import urllib2

def usage(argv):
    print "Usage:", argv[0], "<sparkhost:port> <root token> <company> <params>"
    exit(1)

def main(argv): 
    if len(argv) != 5: usage(argv) 
    host, token, company, searchparams = argv[1:]
    tokens = gettokens(host,token)
    folderinfo = getfolderinfo(host,token)
    findfolders(host, folderinfo, tokens, company, searchparams)

def gettokens(host, token): 
    url = "http://%s/config?token=%s" % (host,token)
    cfg = requests.get(url).json()
    return dict([(comp,d['uuid']) for comp,d in cfg.iteritems()])

def getfolderinfo(host, token): 
    url = "http://%s/config/folders?token=%s" % (host,token)
    return requests.get(url).json()

def findfolders(host, folder_info, tokens, company, searchparams): 
    for comp, comp_data in folder_info.iteritems():
        if comp == company:
            print "Searching folders under "+company+" (Token: "+tokens[comp]+")"
            for org, org_data in comp_data.iteritems():
                for folder, folder_data in org_data.iteritems():
                    searchandprintresults(host, tokens[comp], comp, org, folder, \
                                          searchparams)
                                          
def searchandprintresults(host, token, comp, org, folder, searchparams):
    url = "http://%s/search/%s/%s/%s?token=%s%s" % (host, comp, org, folder, token, searchparams) 
    response = requests.get(url)
    if response.status_code == 200: 
        print "  URL is "+url
        counturl = url+"&output=count"
        countresponse = requests.get(counturl) 
        OUTPUT_FILE = comp+"-"+org+"-"+folder+"-search.json"
        print "    Writing Matching JSON for "+countresponse.text+" matches to "+OUTPUT_FILE
        target = open(OUTPUT_FILE, 'w') 
        data = json.load(urllib2.urlopen(url))
        target.write(json.dumps(data, indent=4, sort_keys=True))
        target.close()

if __name__ == '__main__':
    from sys import argv
    main(argv)

This example command uses get_search.py to search DocTestCo for all records with a positive client emotion value.

python get_search.py example.company.com $token DocTestCo '&client_emotion=positive'

get_search.py saves output to a file like the next example.

Searching folders under DocTestCo (Token: $token)
  URL is http://example.company.com/search/DocTestCo/DocTestCo-DocTesting/Test01?token=$token&client_emotion=positive
    Writing Matching JSON for 4 matches to DocTestCo-DocTestCo-DocTesting-Test01-log.json

POST

Use post_search.py to test POST requests with /search. This script saves results and match count to a file.

Figure 2. post_search.py
#!/usr/bin/env python
#
# Copyright 2017 Voci Technologies  All rights reserved.
# Unsupported example code - Not for production use.
#

import requests
import json
import urllib2

def usage(argv):
    print "Usage:", argv[0], "<sparkhost:port> <root token> <company> <JSON-params-file>"
    exit(1)

def main(argv): 
    if len(argv) != 5: usage(argv)  
    host, token, company, searchparamfile = argv[1:]
    tokens = gettokens(host,token)
    folderinfo = getfolderinfo(host,token)
    findfolders(host, folderinfo, tokens, company, searchparamfile)

def gettokens(host, token): 
    url = "http://%s/config?token=%s" % (host,token)
    cfg = requests.get(url).json()
    return dict([(comp,d['uuid']) for comp,d in cfg.iteritems()])

def getfolderinfo(host, token): 
    url = "http://%s/config/folders?token=%s" % (host,token)
    return requests.get(url).json()

def findfolders(host, folder_info, tokens, company, searchparamfile): 
    for comp, comp_data in folder_info.iteritems():
        if comp == company:
            print "Searching folders under "+company+" (Token: "+tokens[comp]+")"
            for org, org_data in comp_data.iteritems():
                for folder, folder_data in org_data.iteritems():
                    searchandprintresults(host, tokens[comp], comp, org, folder,
                        searchparamfile)
                
def searchandprintresults(host, token, comp, org, folder, searchparamfile):
    url = "http://%s/search/%s/%s/%s?token=%s" % (host, comp, org, folder, token)
    with open(searchparamfile) as json_file: 
        param_data = json.load(json_file)
    header = {'Content-type': 'application/json'}
    response = requests.post(url, data=json.dumps(param_data), headers=header)
    if response.status_code == 200: 
        print "  URL is "+url
        param_data["output"] = "count".decode('utf-8') 
        countresponse = requests.post(url, data=json.dumps(param_data), headers=header)
        OUTPUT_FILE = comp+"-"+org+"-"+folder+"-post-search.json"
        print "    Writing Matching JSON for "+countresponse.text+" matches to "+OUTPUT_FILE
        with open(OUTPUT_FILE, mode='wb') as localfile: 
            localfile.write(response.content)
        localfile.close()

if __name__ == '__main__':
    from sys import argv
    main(argv)

This example command uses post_search.py to search DocTestCo for all records that match the search terms defined in params.json.

python post_search.py example.company.com $token DocTestCo params.json

post_search.py saves output to a file like the next example.

Searching folders under DocTestCo (Token: $token)
  URL is http://example.company.com/search/DocTestCo/DocTestCo-DocTesting/Test01?token=$token
    Writing Matching JSON for 4 matches to DocTestCo-DocTestCo-DocTesting-Test01-search.json