def testJson(self):
     response = LuceneResponse(total=3, hits=['1','2','3'])
     response.drilldownData = [{'terms':[], 'fieldname':'field'}]
     response2 = LuceneResponse.fromJson(response.asJson())
     self.assertEquals(3, response2.total)
     self.assertEquals(['1','2','3'], response2.hits)
     self.assertEquals([{'terms':[], 'fieldname':'field'}], response2.drilldownData)
예제 #2
0
 def testJson(self):
     response = LuceneResponse(total=3, hits=['1', '2', '3'])
     response.drilldownData = [{'terms': [], 'fieldname': 'field'}]
     response2 = LuceneResponse.fromJson(response.asJson())
     self.assertEquals(3, response2.total)
     self.assertEquals(['1', '2', '3'], response2.hits)
     self.assertEquals([{
         'terms': [],
         'fieldname': 'field'
     }], response2.drilldownData)
예제 #3
0
 def setupDna(self, dedupFieldName="__key__.dedup", dedupSortFieldName="__key__.date", dedupByDefault=True):
     self.observer = CallTrace('observer', emptyGeneratorMethods=['executeComposedQuery'])
     self.response = LuceneResponse()
     def executeComposedQuery(*args, **kwargs):
         raise StopIteration(self.response)
         yield
     self.observer.methods['executeComposedQuery'] = executeComposedQuery
     self.tree = be(
         (Observable(),
             (ConvertToComposedQuery(
                     resultsFrom='defaultCore',
                     matches=[(
                             dict(core='defaultCore', uniqueKey='keyDefault'),
                             dict(core='otherCore', key='keyOther')
                         ),
                         (
                             dict(core='defaultCore', uniqueKey='key1'),
                             dict(core='aDifferentKore', key='key2')
                         )
                     ],
                     dedupFieldName=dedupFieldName,
                     dedupSortFieldName=dedupSortFieldName,
                     dedupByDefault=dedupByDefault,
                     drilldownFieldnamesTranslate=lambda name: 'prefix.' + name if name == 'toBePrefixed' else name,
                 ),
                 (self.observer,)
             )
         )
     )
예제 #4
0
    def testServicePrefixSearch(self):
        observer = CallTrace('lucene')

        def prefixSearch(**kwargs):
            raise StopIteration(LuceneResponse(total=2, hits=['aap', 'noot']))
            yield

        observer.methods['prefixSearch'] = prefixSearch
        service = LuceneRemoteService(CallTrace('reactor'))
        service.addObserver(observer)
        body = dumps({
            'message': 'prefixSearch',
            'kwargs': {
                'prefix': 'aap',
                'fieldname': 'field',
                'limit': 10,
            }
        })
        result = ''.join(
            compose(
                service.handleRequest(path='/__lucene_remote__',
                                      Method="POST",
                                      Body=body)))
        header, body = result.split('\r\n' * 2)
        self.assertTrue('Content-Type: application/json' in header, header)
        response = LuceneResponse.fromJson(body)
        self.assertEquals(2, response.total)
        self.assertEquals(['aap', 'noot'], response.hits)
        self.assertEquals(['prefixSearch'], observer.calledMethodNames())
        m = observer.calledMethods[0]
        self.assertEquals('aap', m.kwargs['prefix'])
        self.assertEquals(10, m.kwargs['limit'])
        self.assertEquals('field', m.kwargs['fieldname'])
 def testServicePrefixSearch(self):
     observer = CallTrace('lucene')
     def prefixSearch(**kwargs):
         raise StopIteration(LuceneResponse(total=2, hits=['aap','noot']))
         yield
     observer.methods['prefixSearch'] = prefixSearch
     service = LuceneRemoteService(CallTrace('reactor'))
     service.addObserver(observer)
     body = dumps({
             'message': 'prefixSearch',
             'kwargs':{
                 'prefix':'aap',
                 'fieldname': 'field',
                 'limit': 10,
             }
         })
     result = ''.join(compose(service.handleRequest(path='/__lucene_remote__', Method="POST", Body=body)))
     header, body = result.split('\r\n'*2)
     self.assertTrue('Content-Type: application/json' in header, header)
     response = LuceneResponse.fromJson(body)
     self.assertEquals(2, response.total)
     self.assertEquals(['aap', 'noot'], response.hits)
     self.assertEquals(['prefixSearch'], observer.calledMethodNames())
     m = observer.calledMethods[0]
     self.assertEquals('aap', m.kwargs['prefix'])
     self.assertEquals(10, m.kwargs['limit'])
     self.assertEquals('field', m.kwargs['fieldname'])
 def testServiceExecuteQuery(self):
     observer = CallTrace('lucene')
     def executeQuery(**kwargs):
         raise StopIteration(LuceneResponse(total=2, hits=['aap','noot']))
         yield
     observer.methods['executeQuery'] = executeQuery
     service = LuceneRemoteService(CallTrace('reactor'))
     service.addObserver(observer)
     body = dumps({
             'message': 'executeQuery',
             'kwargs':{
                 'cqlAbstractSyntaxTree': {'__CQL_QUERY__': 'query AND field=value'},
                 'start':0,
                 'stop': 10,
                 'facets': [{'fieldname': 'field', 'maxTerms':5}],
                 'filterQueries': [{'__CQL_QUERY__': 'query=fiets'}],
                 'joinQueries': {'core1': {'__CQL_QUERY__': 'query=test'}}
             }
         })
     result = ''.join(compose(service.handleRequest(path='/__lucene_remote__', Method="POST", Body=body)))
     header, body = result.split('\r\n'*2)
     self.assertTrue('Content-Type: application/json' in header, header+body)
     response = LuceneResponse.fromJson(body)
     self.assertEquals(2, response.total)
     self.assertEquals(['aap', 'noot'], response.hits)
     self.assertEquals(['executeQuery'], observer.calledMethodNames())
     m = observer.calledMethods[0]
     self.assertEquals(parseString('query AND field=value'), m.kwargs['cqlAbstractSyntaxTree'])
     self.assertEquals(0, m.kwargs['start'])
     self.assertEquals(10, m.kwargs['stop'])
     self.assertEquals([{'fieldname': 'field', 'maxTerms':5}], m.kwargs['facets'])
     self.assertEquals([parseString('query=fiets')], m.kwargs['filterQueries'])
     self.assertEquals({'core1': parseString('query=test')}, m.kwargs['joinQueries'])
예제 #7
0
 def testXTermDrilldown(self):
     self.response = LuceneResponse(drilldownData=[
             dict(fieldname='prefix:field1', terms=[dict(term='term1', count=1)]),
             dict(fieldname='unknownJoinName.field', terms=[]),
             dict(fieldname='normal:drilldown', terms=[]),
             dict(fieldname='prefix:field2', terms=[dict(term='term2', count=1)]),
         ])
     response = retval(self.tree.any.executeQuery(
             cqlAbstractSyntaxTree=parseCQL('*'),
             extraArguments={},
             facets=[
                 dict(fieldname='otherCore.prefix:field2', maxTerms=7),
                 dict(fieldname='normal:drilldown', maxTerms=11),
                 dict(fieldname='otherCore.prefix:field1', maxTerms=9),
                 dict(fieldname='unknownJoinName.field', maxTerms=12)
             ],
             someKwarg='someValue'))
     self.assertEquals(['executeComposedQuery'], self.observer.calledMethodNames())
     cq = self.observer.calledMethods[0].kwargs['query']
     cq.validate()
     self.assertEquals(set(['defaultCore', 'otherCore']), cq.cores)
     self.assertEquals('keyDefault', cq.keyName('defaultCore', 'otherCore'))
     self.assertEquals('keyOther', cq.keyName('otherCore', 'defaultCore'))
     self.assertEquals([dict(fieldname='prefix:field2', path=[], maxTerms=7), dict(fieldname='prefix:field1', path=[], maxTerms=9)], cq.facetsFor('otherCore'))
     self.assertEquals([dict(fieldname='normal:drilldown', path=[], maxTerms=11), dict(fieldname='unknownJoinName.field', path=[], maxTerms=12)], cq.facetsFor('defaultCore'))
     self.assertEquals([
             dict(fieldname='otherCore.prefix:field2', terms=[dict(term='term2', count=1)]),
             dict(fieldname='normal:drilldown', terms=[]),
             dict(fieldname='otherCore.prefix:field1', terms=[dict(term='term1', count=1)]),
             dict(fieldname='unknownJoinName.field', terms=[])
         ], response.drilldownData)
예제 #8
0
 def _send(self, message, **kwargs):
     body = self._conversion.jsonDumpMessage(message, **kwargs)
     headers={'Content-Type': 'application/json', 'Content-Length': len(body)}
     host, port = self._luceneRemoteServer() # WARNING: can return a different server each time.
     response = yield self._httppost(host=host, port=port, request=self._path, body=body, headers=headers)
     header, responseBody = response.split("\r\n\r\n", 1)
     self._verify200(header, response)
     raise StopIteration(LuceneResponse.fromJson(responseBody))
예제 #9
0
 def httppost(*args, **kwargs):
     raise StopIteration('HTTP/1.0 200 Ok\r\n\r\n%s' % LuceneResponse(
         total=5,
         hits=[Hit("1"),
               Hit("2"),
               Hit("3"),
               Hit("4"),
               Hit("5")]).asJson())
     yield
예제 #10
0
    def testServiceExecuteQuery(self):
        observer = CallTrace('lucene')

        def executeQuery(**kwargs):
            raise StopIteration(LuceneResponse(total=2, hits=['aap', 'noot']))
            yield

        observer.methods['executeQuery'] = executeQuery
        service = LuceneRemoteService(CallTrace('reactor'))
        service.addObserver(observer)
        body = dumps({
            'message': 'executeQuery',
            'kwargs': {
                'cqlAbstractSyntaxTree': {
                    '__CQL_QUERY__': 'query AND field=value'
                },
                'start': 0,
                'stop': 10,
                'facets': [{
                    'fieldname': 'field',
                    'maxTerms': 5
                }],
                'filterQueries': [{
                    '__CQL_QUERY__': 'query=fiets'
                }],
                'joinQueries': {
                    'core1': {
                        '__CQL_QUERY__': 'query=test'
                    }
                }
            }
        })
        result = ''.join(
            compose(
                service.handleRequest(path='/__lucene_remote__',
                                      Method="POST",
                                      Body=body)))
        header, body = result.split('\r\n' * 2)
        self.assertTrue('Content-Type: application/json' in header,
                        header + body)
        response = LuceneResponse.fromJson(body)
        self.assertEquals(2, response.total)
        self.assertEquals(['aap', 'noot'], response.hits)
        self.assertEquals(['executeQuery'], observer.calledMethodNames())
        m = observer.calledMethods[0]
        self.assertEquals(parseString('query AND field=value'),
                          m.kwargs['cqlAbstractSyntaxTree'])
        self.assertEquals(0, m.kwargs['start'])
        self.assertEquals(10, m.kwargs['stop'])
        self.assertEquals([{
            'fieldname': 'field',
            'maxTerms': 5
        }], m.kwargs['facets'])
        self.assertEquals([parseString('query=fiets')],
                          m.kwargs['filterQueries'])
        self.assertEquals({'core1': parseString('query=test')},
                          m.kwargs['joinQueries'])
예제 #11
0
 def drilldownFieldnames(self, path=None, limit=50, **kwargs):
     args = dict(limit=limit)
     if path:
         args["dim"] = path[0]
         args["path"] = path[1:]
     args = urlencode(args, doseq=True)
     fieldnames = (yield self._connect().send(path='/drilldownFieldnames/?{}'.format(args)))
     raise StopIteration(LuceneResponse(total=len(fieldnames), hits=fieldnames))
     yield
예제 #12
0
 def prefixSearch(self, fieldname, prefix, showCount=False, limit=10, **kwargs):
     jsonDict = JsonDict(
         fieldname=fieldname,
         prefix=prefix,
         limit=limit,
     )
     args = urlencode(dict(fieldname=fieldname, prefix=prefix, limit=limit))
     responseDict = (yield self._connect().send(jsonDict=jsonDict, path='/prefixSearch/?{}'.format(args)))
     hits = [((term, count) if showCount else term) for term, count in sorted(responseDict, key=lambda t: t[1], reverse=True)]
     response = LuceneResponse(total=len(hits), hits=hits)
     raise StopIteration(response)
     yield
예제 #13
0
 def _send(self, message, **kwargs):
     body = self._conversion.jsonDumpMessage(message, **kwargs)
     headers = {
         'Content-Type': 'application/json',
         'Content-Length': len(body)
     }
     host, port = self._luceneRemoteServer(
     )  # WARNING: can return a different server each time.
     response = yield self._httppost(host=host,
                                     port=port,
                                     request=self._path,
                                     body=body,
                                     headers=headers)
     header, responseBody = response.split("\r\n\r\n", 1)
     self._verify200(header, response)
     raise StopIteration(LuceneResponse.fromJson(responseBody))
예제 #14
0
def luceneResponseFromDict(responseDict):
    hits = [Hit(**hit) for hit in responseDict['hits']]
    response = LuceneResponse(total=responseDict["total"], queryTime=responseDict["queryTime"], hits=hits, drilldownData=[])
    if "totalWithDuplicates" in responseDict:
        response.totalWithDuplicates = responseDict['totalWithDuplicates']
    if "drilldownData" in responseDict:
        response.drilldownData = responseDict['drilldownData']
    if "suggestions" in responseDict:
        response.suggestions = responseDict['suggestions']
    if "times" in responseDict:
        response.times = responseDict['times']
    return response
예제 #15
0
    def testHierarchicalXTermDrilldown(self):
        self.response = LuceneResponse(drilldownData=[
            dict(fieldname='field1', path=['field2'], terms=[dict(term='term1', count=1)]),
        ])

        response = retval(self.tree.any.executeQuery(
            cqlAbstractSyntaxTree=parseCQL('*'),
            extraArguments={},
            facets=[
                dict(fieldname='otherCore.field1>field2', maxTerms=10),
            ],
            someKwarg='someValue'))
        self.assertEquals(['executeComposedQuery'], self.observer.calledMethodNames())
        cq = self.observer.calledMethods[0].kwargs['query']
        cq.validate()
        self.assertEquals([{'fieldname': 'field1', 'path': ['field2'], 'maxTerms': 10}], cq.facetsFor('otherCore'))
        self.assertEquals([
            dict(fieldname='otherCore.field1', path=['field2'], terms=[dict(term='term1', count=1)]),
        ], response.drilldownData)
예제 #16
0
 def fieldnames(**kwargs):
     raise StopIteration(LuceneResponse(total=2, hits=['aap', 'noot']))
     yield
예제 #17
0
 def httppost(*args, **kwargs):
     raise StopIteration('HTTP/1.0 200 Ok\r\n\r\n%s' % LuceneResponse(
         total=5, hits=["1", "2", "3", "4", "5"]).asJson())
     yield
예제 #18
0
 def httppost(*args, **kwargs):
     raise StopIteration(
         'HTTP/1.0 200 Ok\r\n\r\n%s' %
         LuceneResponse(total=2, hits=["field0", "field1"]).asJson())
     yield
예제 #19
0
 def fieldnames(self, **kwargs):
     fieldnames = (yield self._connect().send(path='/fieldnames/'))
     raise StopIteration(LuceneResponse(total=len(fieldnames), hits=fieldnames))
     yield
예제 #20
0
 def executeQuery(**kwargs):
     raise StopIteration(LuceneResponse(total=2, hits=['aap', 'noot']))
     yield
예제 #21
0
 def prefixSearch(**kwargs):
     raise StopIteration(LuceneResponse(total=2, hits=['aap', 'noot']))
     yield