MCPcopy Create free account
hub / github.com/apache/impala / Levenshtein

Method Levenshtein

be/src/exprs/string-functions-ir.cc:1587–1635  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1585}
1586
1587IntVal StringFunctions::Levenshtein(
1588 FunctionContext* ctx, const StringVal& s1, const StringVal& s2) {
1589 // Adapted from https://bit.ly/2SbDgN4
1590 // under the Creative Commons Attribution-ShareAlike License
1591
1592 int s1len = s1.len;
1593 int s2len = s2.len;
1594
1595 // error if either input exceeds 255 characters
1596 if (s1len > 255 || s2len > 255) {
1597 ctx->SetError("levenshtein argument exceeds maximum length of 255 characters");
1598 return IntVal(-1);
1599 }
1600
1601 // short cut cases:
1602 // - null strings
1603 // - zero length strings
1604 // - identical length and value strings
1605 if (s1.is_null || s2.is_null) return IntVal::null();
1606 if (s1len == 0) return IntVal(s2len);
1607 if (s2len == 0) return IntVal(s1len);
1608 if (s1len == s2len && memcmp(s1.ptr, s2.ptr, s1len) == 0) return IntVal(0);
1609
1610 int column_start = 1;
1611
1612 int* column = reinterpret_cast<int*>(ctx->Allocate(sizeof(int) * (s1len + 1)));
1613 if (UNLIKELY(column == nullptr)) {
1614 DCHECK(!ctx->impl()->state()->GetQueryStatus().ok());
1615 return IntVal::null();
1616 }
1617
1618 std::iota(column + column_start - 1, column + s1len + 1, column_start - 1);
1619
1620 for (int x = column_start; x <= s2len; x++) {
1621 column[0] = x;
1622 int last_diagonal = x - column_start;
1623 for (int y = column_start; y <= s1len; y++) {
1624 int old_diagonal = column[y];
1625 auto possibilities = {column[y] + 1, column[y - 1] + 1,
1626 last_diagonal + (s1.ptr[y - 1] == s2.ptr[x - 1] ? 0 : 1)};
1627 column[y] = std::min(possibilities);
1628 last_diagonal = old_diagonal;
1629 }
1630 }
1631 int result = column[s1len];
1632 ctx->Free(reinterpret_cast<uint8_t*>(column));
1633
1634 return IntVal(result);
1635}
1636
1637// Based on https://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
1638// Implements Jaro similarity

Callers

nothing calls this directly

Calls 9

IntValClass · 0.85
minFunction · 0.85
implMethod · 0.80
SetErrorMethod · 0.45
AllocateMethod · 0.45
okMethod · 0.45
GetQueryStatusMethod · 0.45
stateMethod · 0.45
FreeMethod · 0.45

Tested by

no test coverage detected