[ML] Fix text structure NPE when fields in list have null value (#125922) (#127508)
Validate Gradle Wrapper / Validation (push) Has been cancelled Details

Co-authored-by: weizijun <weizijun.wzj@alibaba-inc.com>
This commit is contained in:
David Kyle 2025-04-29 16:04:07 +01:00 committed by GitHub
parent 4c86ee4277
commit dbcbbbd0bc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 2 deletions

View File

@ -0,0 +1,5 @@
pr: 125922
summary: Fix text structure NPE when fields in list have null value
area: Machine Learning
type: bug
issues: []

View File

@ -23,6 +23,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.SortedMap; import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
@ -329,7 +330,7 @@ public final class TextStructureUtils {
List<Object> fieldValues = sampleRecords.stream() List<Object> fieldValues = sampleRecords.stream()
.map(record -> record.get(fieldName)) .map(record -> record.get(fieldName))
.filter(fieldValue -> fieldValue != null) .filter(Objects::nonNull)
.collect(Collectors.toList()); .collect(Collectors.toList());
Tuple<Map<String, String>, FieldStats> mappingAndFieldStats = guessMappingAndCalculateFieldStats( Tuple<Map<String, String>, FieldStats> mappingAndFieldStats = guessMappingAndCalculateFieldStats(
@ -425,7 +426,10 @@ public final class TextStructureUtils {
); );
} }
Collection<String> fieldValuesAsStrings = fieldValues.stream().map(Object::toString).collect(Collectors.toList()); Collection<String> fieldValuesAsStrings = fieldValues.stream()
.filter(Objects::nonNull)
.map(Object::toString)
.collect(Collectors.toList());
Map<String, String> mapping = guessScalarMapping( Map<String, String> mapping = guessScalarMapping(
explanation, explanation,
fieldName, fieldName,

View File

@ -1106,6 +1106,16 @@ public class TextStructureUtilsTests extends TextStructureTestCase {
} }
} }
public void testGuessMappingWithNullValue() {
Map<String, String> expected = Collections.singletonMap(TextStructureUtils.MAPPING_TYPE_SETTING, "keyword");
Consumer<Boolean> testGuessMappingGivenEcsCompatibility = (ecsCompatibility) -> {
assertEquals(expected, guessMapping(explanation, "foo", Arrays.asList("ERROR", null, "DEBUG"), ecsCompatibility));
};
ecsCompatibilityModes.forEach(testGuessMappingGivenEcsCompatibility);
}
private Map<String, String> guessMapping( private Map<String, String> guessMapping(
List<String> explanation, List<String> explanation,
String fieldName, String fieldName,