Skip to content

Commit 9fcdb58

Browse files
committed
1 parent 422d2e4 commit 9fcdb58

4 files changed

Lines changed: 39 additions & 16 deletions

File tree

src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,17 @@ static final class PhonemeBuilder {
6666
* @return a new, empty phoneme builder
6767
*/
6868
public static PhonemeBuilder empty(final Languages.LanguageSet languages) {
69-
return new PhonemeBuilder(Collections.singleton(new Rule.Phoneme("", languages)));
69+
return new PhonemeBuilder(new Rule.Phoneme("", languages));
7070
}
7171

7272
private final Set<Rule.Phoneme> phonemes;
7373

74-
private PhonemeBuilder(final Set<Rule.Phoneme> phonemes) {
74+
private PhonemeBuilder(Rule.Phoneme phoneme) {
75+
this.phonemes = new LinkedHashSet<Rule.Phoneme>();
76+
this.phonemes.add(phoneme);
77+
}
78+
79+
private PhonemeBuilder(Set<Rule.Phoneme> phonemes) {
7580
this.phonemes = phonemes;
7681
}
7782

@@ -81,14 +86,10 @@ private PhonemeBuilder(final Set<Rule.Phoneme> phonemes) {
8186
* @param str the characters to append to the phonemes
8287
* @return a new phoneme builder lenghtened by <code>str</code>
8388
*/
84-
public PhonemeBuilder append(final CharSequence str) {
85-
final Set<Rule.Phoneme> newPhonemes = new LinkedHashSet<Rule.Phoneme>();
86-
89+
public void append(final CharSequence str) {
8790
for (final Rule.Phoneme ph : this.phonemes) {
88-
newPhonemes.add(ph.append(str));
91+
ph.append(str);
8992
}
90-
91-
return new PhonemeBuilder(newPhonemes);
9293
}
9394

9495
/**
@@ -380,7 +381,7 @@ private PhonemeBuilder applyFinalRules(final PhonemeBuilder phonemeBuilder, fina
380381

381382
if (!found) {
382383
// not found, appending as-is
383-
subBuilder = subBuilder.append(phonemeText.subSequence(i, i + 1));
384+
subBuilder.append(phonemeText.subSequence(i, i + 1));
384385
}
385386

386387
i = rulesApplication.getI();

src/main/java/org/apache/commons/codec/language/bm/Rule.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,16 +101,22 @@ public int compare(final Phoneme o1, final Phoneme o2) {
101101
}
102102
};
103103

104-
private final CharSequence phonemeText;
104+
private final StringBuilder phonemeText;
105105
private final Languages.LanguageSet languages;
106106

107107
public Phoneme(final CharSequence phonemeText, final Languages.LanguageSet languages) {
108-
this.phonemeText = phonemeText;
108+
this.phonemeText = new StringBuilder(phonemeText);
109109
this.languages = languages;
110110
}
111+
112+
public Phoneme(final Phoneme phonemeLeft, final Phoneme phonemeRight) {
113+
this.phonemeText = new StringBuilder(phonemeLeft.phonemeText);
114+
this.phonemeText.append(phonemeRight.phonemeText);
115+
this.languages = phonemeLeft.languages;
116+
}
111117

112-
public Phoneme append(final CharSequence str) {
113-
return new Phoneme(this.phonemeText.toString() + str.toString(), this.languages);
118+
public void append(final CharSequence str) {
119+
this.phonemeText.append(str);
114120
}
115121

116122
public Languages.LanguageSet getLanguages() {

src/test/java/org/apache/commons/codec/language/bm/PhoneticEnginePerformanceTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@
7676
* <p>
7777
* Patch not applied.
7878
* </p>
79+
* <p>
80+
* On this file's revision 1539787, with patch <a
81+
* href="https://issues.apache.org/jira/secure/attachment/12612178/CODEC-174-reuse-set-in-PhonemeBuilder.patch"
82+
* >CODEC-174-reuse-set-in-PhonemeBuilder.patch</a>:
83+
* </p>
84+
* <ol>
85+
* <li>Time for encoding 80,000 times the input 'Angelo': 13,724 millis.</li>
86+
* <li>Time for encoding 80,000 times the input 'Angelo': 13,451 millis.</li>
87+
* <li>Time for encoding 80,000 times the input 'Angelo': 13,742 millis.</li>
88+
* <li>Time for encoding 80,000 times the input 'Angelo': 13,186 millis.</li>
89+
* <li>Time for encoding 80,000 times the input 'Angelo': 13,600 millis.</li>
90+
* <li>Time for encoding 80,000 times the input 'Angelo': 16,405 millis.</li>
91+
* </ol>
92+
* <p>
93+
*
94+
* </p>
7995
*/
8096
public class PhoneticEnginePerformanceTest {
8197

src/test/java/org/apache/commons/codec/language/bm/RuleTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,14 @@ public void testSubSequenceWorks() {
107107
assertEquals('k', jkl.getPhonemeText().charAt(1));
108108
assertEquals('l', jkl.getPhonemeText().charAt(2));
109109

110-
final Rule.Phoneme a_b = a.append(b.getPhonemeText());
110+
final Rule.Phoneme a_b = new Rule.Phoneme(a, b);
111111
assertEquals('a', a_b.getPhonemeText().charAt(0));
112112
assertEquals('b', a_b.getPhonemeText().charAt(1));
113113
assertEquals("ab", a_b.getPhonemeText().subSequence(0, 2).toString());
114114
assertEquals("a", a_b.getPhonemeText().subSequence(0, 1).toString());
115115
assertEquals("b", a_b.getPhonemeText().subSequence(1, 2).toString());
116116

117-
final Rule.Phoneme cd_ef = cd.append(ef.getPhonemeText());
117+
final Rule.Phoneme cd_ef = new Rule.Phoneme(cd, ef);
118118
assertEquals('c', cd_ef.getPhonemeText().charAt(0));
119119
assertEquals('d', cd_ef.getPhonemeText().charAt(1));
120120
assertEquals('e', cd_ef.getPhonemeText().charAt(2));
@@ -130,7 +130,7 @@ public void testSubSequenceWorks() {
130130
assertEquals("def", cd_ef.getPhonemeText().subSequence(1, 4).toString());
131131
assertEquals("cdef", cd_ef.getPhonemeText().subSequence(0, 4).toString());
132132

133-
final Rule.Phoneme a_b_cd = a.append(b.getPhonemeText()).append(cd.getPhonemeText());
133+
final Rule.Phoneme a_b_cd = new Rule.Phoneme(new Rule.Phoneme(a, b), cd);
134134
assertEquals('a', a_b_cd.getPhonemeText().charAt(0));
135135
assertEquals('b', a_b_cd.getPhonemeText().charAt(1));
136136
assertEquals('c', a_b_cd.getPhonemeText().charAt(2));

0 commit comments

Comments
 (0)