Esempio n. 1
0
def retrieveTopAnswers(surveyId,
                       questionId,
                       answerStart=None,
                       hideReasons=False):
    questionIdStr = str(questionId)
    logging.debug(('retrieveTopAnswers()', 'answerStart=', answerStart))

    answerRecords = []

    # Require user-input to suggest answers, to force some user thought
    inputWords = text.uniqueInOrder(
        text.removeStopWords(text.tokenize(answerStart)))
    logging.debug(('retrieveTopAnswers()', 'inputWords=', inputWords))
    if inputWords and (0 < len(inputWords)):
        # Retrieve answer records
        answerRecords = Answer.query(
            Answer.surveyId == surveyId, Answer.questionId == questionIdStr,
            Answer.words == inputWords[-1]).order(-Answer.score).fetch(1)
        if (2 <= len(inputWords)):
            tuple = ' '.join(inputWords[-2:-1])
            answerRecords += Answer.query(
                Answer.surveyId == surveyId,
                Answer.questionId == questionIdStr,
                Answer.words == tuple).order(-Answer.score).fetch(1)
        logging.debug(
            ('retrieveTopAnswers()', 'answerRecords=', answerRecords))

    # Filter out empty answer/reason
    # Answers missing required-reason should not be saveable.  Nor should empty answers.
    if hideReasons:
        answerRecords = filter(lambda a: a.hasAnswer(), answerRecords)
    else:
        answerRecords = filter(lambda a: a.hasAnswerAndReason(), answerRecords)

    return answerRecords
Esempio n. 2
0
def retrieveTopSlicesByScoreForStart(budgetId, sliceStart, hideReasons=False):

    logging.debug(
        ('retrieveTopSlicesByScoreForStart()', 'sliceStart=', sliceStart))

    # We always have sliceStart, since we're not pre-populating slice-suggestions, there must always be slice input
    sliceRecords = []
    inputWords = text.uniqueInOrder(
        text.removeStopWords(text.tokenize(sliceStart)))
    logging.debug('retrieveTopSlices() inputWords=' + str(inputWords))
    if inputWords and (0 < len(inputWords)):
        # Retrieve top-voted slice-records matching last input-word.  Results will be collected and match-scored in client.
        # Only one inequality filter per query is supported, so cannot require both title and reason are non-null
        sliceRecords = Slice.query(
            Slice.budgetId == budgetId,
            Slice.words == inputWords[-1]).order(-Slice.score).fetch(1)
        # Retrieve for last input-word-pair
        if (2 <= len(inputWords)):
            tuple = ' '.join(inputWords[-2:-1])
            sliceRecords += Slice.query(
                Slice.budgetId == budgetId,
                Slice.words == tuple).order(-Slice.score).fetch(1)
    logging.debug('retrieveTopSlices() sliceRecords=' + str(sliceRecords))

    # Filter out empty title/reason
    # There should be no records missing title & reason, since these should not be saveable, and should not word-match
    if hideReasons: sliceRecords = filter(lambda s: s.hasTitle(), sliceRecords)
    else: sliceRecords = filter(lambda s: s.hasTitleAndReason(), sliceRecords)

    return sliceRecords
Esempio n. 3
0
 def setContent(self, content):
     self.content = content
     # Index content words
     words = text.uniqueInOrder(text.removeStopWords(
         text.tokenize(content)))
     words = words[0:
                   conf.MAX_WORDS_INDEXED]  # Limit number of words indexed
     self.words = text.tuples(words, maxSize=2)
Esempio n. 4
0
 def setContent(self, title, detail):
     self.title = title
     self.detail = detail
     # Index content words
     words = text.uniqueInOrder(
         text.removeStopWords(text.tokenize(title) + text.tokenize(detail)))
     words = words[0:
                   conf.MAX_WORDS_INDEXED]  # Limit number of words indexed
     self.words = text.tuples(words, maxSize=2)
Esempio n. 5
0
 def create(budgetId, title, reason, creator=None, fromEditPage=False):
     slice = Slice(id=Slice.toKeyId(budgetId, title, reason),
                   budgetId=budgetId,
                   title=title,
                   reason=reason,
                   creator=creator,
                   fromEditPage=fromEditPage)
     # Index content words
     content = ' '.join([w for w in [title, reason] if w])
     words = text.uniqueInOrder(text.removeStopWords(
         text.tokenize(content)))
     words = words[0:
                   conf.MAX_WORDS_INDEXED]  # Limit number of words indexed
     slice.words = text.tuples(words, maxSize=2)
     return slice
Esempio n. 6
0
def retrieveTopReasonsForStart(proposalId, reasonStart):
    proposalIdStr = str(proposalId)
    inputWords = text.uniqueInOrder(
        text.removeStopWords(text.tokenize(reasonStart)))
    if conf.isDev:
        logging.debug('retrieveTopReasonsForStart() inputWords=' +
                      str(inputWords))

    reasonRecordFutures = []
    if inputWords and (0 < len(inputWords)):
        # Retrieve top-voted reason-records matching last input-word
        # Results will be collected & match-scored in client
        lastWord = inputWords[-1]
        reasonRecordFutures.append(
            Reason.query(
                Reason.proposalId == proposalIdStr,
                Reason.words == lastWord).order(-Reason.score).fetch_async(1))
        # Retrieve for last input-word-pair
        if (2 <= len(inputWords)):
            lastTuple = ' '.join(inputWords[-2:-1])
            reasonRecordFutures.append(
                Reason.query(Reason.proposalId == proposalIdStr, Reason.words
                             == lastTuple).order(-Reason.score).fetch_async(1))

    # De-duplicate records, since both word & tuple-top-suggestion may be the same
    recordsUnique = {}
    for f in reasonRecordFutures:
        if f:
            for r in f.get_result():
                if r:
                    recordsUnique[r.key.id()] = r
    if conf.isDev:
        logging.debug('retrieveTopReasonsForStart() recordsUnique=' +
                      str(recordsUnique))

    return recordsUnique.values()
Esempio n. 7
0
 def setContent(self, content):
     self.content = content
     words = text.uniqueInOrder(text.removeStopWords(
         text.tokenize(content)))
     words = words[0:20]  # Limit number of words indexed
     self.words = text.tuples(words, maxSize=2)