word_property.cpp revision 88fa47a27d45f6460971d0d223aa558e121b3478
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "suggest/core/dictionary/property/word_property.h"
18
19#include "utils/jni_data_utils.h"
20
21namespace latinime {
22
23void WordProperty::outputProperties(JNIEnv *const env, jintArray outCodePoints,
24        jbooleanArray outFlags, jintArray outProbabilityInfo, jobject outBigramTargets,
25        jobject outBigramProbabilities, jobject outShortcutTargets,
26        jobject outShortcutProbabilities) const {
27    JniDataUtils::outputCodePoints(env, outCodePoints, 0 /* start */,
28            MAX_WORD_LENGTH /* maxLength */, mCodePoints.data(), mCodePoints.size(),
29            false /* needsNullTermination */);
30    jboolean flags[] = {mUnigramProperty.isNotAWord(), mUnigramProperty.isBlacklisted(),
31            !mBigrams.empty(), mUnigramProperty.hasShortcuts(),
32            mUnigramProperty.representsBeginningOfSentence()};
33    env->SetBooleanArrayRegion(outFlags, 0 /* start */, NELEMS(flags), flags);
34    int probabilityInfo[] = {mUnigramProperty.getProbability(), mUnigramProperty.getTimestamp(),
35            mUnigramProperty.getLevel(), mUnigramProperty.getCount()};
36    env->SetIntArrayRegion(outProbabilityInfo, 0 /* start */, NELEMS(probabilityInfo),
37            probabilityInfo);
38
39    jclass integerClass = env->FindClass("java/lang/Integer");
40    jmethodID intToIntegerConstructorId = env->GetMethodID(integerClass, "<init>", "(I)V");
41    jclass arrayListClass = env->FindClass("java/util/ArrayList");
42    jmethodID addMethodId = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
43
44    // Output bigrams.
45    for (const auto &bigramProperty : mBigrams) {
46        const std::vector<int> *const word1CodePoints = bigramProperty.getTargetCodePoints();
47        jintArray bigramWord1CodePointArray = env->NewIntArray(word1CodePoints->size());
48        JniDataUtils::outputCodePoints(env, bigramWord1CodePointArray, 0 /* start */,
49                word1CodePoints->size(), word1CodePoints->data(), word1CodePoints->size(),
50                false /* needsNullTermination */);
51        env->CallBooleanMethod(outBigramTargets, addMethodId, bigramWord1CodePointArray);
52        env->DeleteLocalRef(bigramWord1CodePointArray);
53
54        int bigramProbabilityInfo[] = {bigramProperty.getProbability(),
55                bigramProperty.getTimestamp(), bigramProperty.getLevel(),
56                bigramProperty.getCount()};
57        jintArray bigramProbabilityInfoArray = env->NewIntArray(NELEMS(bigramProbabilityInfo));
58        env->SetIntArrayRegion(bigramProbabilityInfoArray, 0 /* start */,
59                NELEMS(bigramProbabilityInfo), bigramProbabilityInfo);
60        env->CallBooleanMethod(outBigramProbabilities, addMethodId, bigramProbabilityInfoArray);
61        env->DeleteLocalRef(bigramProbabilityInfoArray);
62    }
63
64    // Output shortcuts.
65    for (const auto &shortcut : mUnigramProperty.getShortcuts()) {
66        const std::vector<int> *const targetCodePoints = shortcut.getTargetCodePoints();
67        jintArray shortcutTargetCodePointArray = env->NewIntArray(targetCodePoints->size());
68        env->SetIntArrayRegion(shortcutTargetCodePointArray, 0 /* start */,
69                targetCodePoints->size(), targetCodePoints->data());
70        JniDataUtils::outputCodePoints(env, shortcutTargetCodePointArray, 0 /* start */,
71                targetCodePoints->size(), targetCodePoints->data(), targetCodePoints->size(),
72                false /* needsNullTermination */);
73        env->CallBooleanMethod(outShortcutTargets, addMethodId, shortcutTargetCodePointArray);
74        env->DeleteLocalRef(shortcutTargetCodePointArray);
75        jobject integerProbability = env->NewObject(integerClass, intToIntegerConstructorId,
76                shortcut.getProbability());
77        env->CallBooleanMethod(outShortcutProbabilities, addMethodId, integerProbability);
78        env->DeleteLocalRef(integerProbability);
79    }
80    env->DeleteLocalRef(integerClass);
81    env->DeleteLocalRef(arrayListClass);
82}
83
84} // namespace latinime
85