From 7b7c469a938c3be885b9fadb6a9fffbaf934d1c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Tr=C3=A1vn=C3=AD=C4=8Dek?= <jan.travnicek@fit.cvut.cz>
Date: Thu, 30 Dec 2021 15:15:14 +0100
Subject: [PATCH] algo: test and fix knuth morris pratt on nonlinear tree
 patterns

---
 alib2algo/src/tree/properties/BorderArray.h | 22 ++++++++++++++++++++-
 tests/cppaql/arbologyTest.cpp               |  4 ++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/alib2algo/src/tree/properties/BorderArray.h b/alib2algo/src/tree/properties/BorderArray.h
index 47b385ece8..4b2f58d511 100644
--- a/alib2algo/src/tree/properties/BorderArray.h
+++ b/alib2algo/src/tree/properties/BorderArray.h
@@ -27,6 +27,26 @@ bool symbolCompare ( const tree::PrefixRankedExtendedPattern < SymbolType > & pa
 	const auto& symbol2 = pattern.getContent ( )[ j ];
 	return symbol1 == symbol2 || ( symbol1.getRank ( ) == symbol2.getRank ( ) && ( pattern.getNodeWildcards ( ).contains ( symbol1 ) || pattern.getNodeWildcards ( ).contains ( symbol2 ) ) );
 }
+
+template < class PrefixRankedPatternType >
+bool variableCompare ( const PrefixRankedPatternType & pattern, size_t i, size_t j ) {
+	return pattern.getContent ( )[ i ] == pattern.getSubtreeWildcard ( ) || pattern.getContent ( )[ j ] == pattern.getSubtreeWildcard ( );
+}
+
+template < class SymbolType >
+bool variableCompare ( const tree::PrefixRankedNonlinearPattern < SymbolType > & pattern, size_t i, size_t j ) {
+	const auto& symbol1 = pattern.getContent ( )[ i ];
+	const auto& symbol2 = pattern.getContent ( )[ j ];
+	return symbol1 == pattern.getSubtreeWildcard ( ) || symbol2 == pattern.getSubtreeWildcard ( ) || pattern.getNonlinearVariables ( ).contains ( symbol1 ) || pattern.getNonlinearVariables ( ).contains ( symbol2 );
+}
+
+template < class SymbolType >
+bool variableCompare ( const tree::PrefixRankedBarNonlinearPattern < SymbolType > & pattern, size_t i, size_t j ) {
+	const auto& symbol1 = pattern.getContent ( )[ i ];
+	const auto& symbol2 = pattern.getContent ( )[ j ];
+	return symbol1 == pattern.getSubtreeWildcard ( ) || symbol2 == pattern.getSubtreeWildcard ( ) || pattern.getNonlinearVariables ( ).contains ( symbol1 ) || pattern.getNonlinearVariables ( ).contains ( symbol2 );
+}
+
 }
 
 namespace tree::properties {
@@ -65,7 +85,7 @@ ext::vector < size_t > BorderArray::construct ( const PrefixRankedPatternType &
 				maxs [ j ] = std::max ( maxs [ j ], j + 1 - ofs );
 				i++;
 				j++;
-			} else if ( pattern.getContent ( )[ i ] == pattern.getSubtreeWildcard ( ) || pattern.getContent ( )[ j ] == pattern.getSubtreeWildcard ( ) ) {
+			} else if ( variableCompare ( pattern, i, j ) ) {
 				for ( int k = static_cast < int > ( j ); k < subtreeJumpTable [ j ] ; k++ )
 					maxs [ k ] = std::max ( maxs [ k ], k + 1 - ofs );
 
diff --git a/tests/cppaql/arbologyTest.cpp b/tests/cppaql/arbologyTest.cpp
index 9482a0ff1e..653a36d5eb 100644
--- a/tests/cppaql/arbologyTest.cpp
+++ b/tests/cppaql/arbologyTest.cpp
@@ -156,6 +156,10 @@ TEST_CASE ( "Arbology tests | nonlinear pattern", "[integration]" ) {
 				"arbology::indexing::NonlinearFullAndLinearIndexConstruction (PrefixRankedBarTree)$subject | arbology::query::NonlinearFullAndLinearIndexPatterns - (PrefixRankedBarNonlinearPattern) $pattern", 1000 ),
 		std::make_tuple ( "Exact Pattern Match (NonlinearPattern PrefixRankedBar)",
 				"arbology::exact::ExactPatternMatch (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern) <(tree::GeneralAlphabet::add $pattern <(tree::GeneralAlphabet::get $subject))", 1000 ),
+		std::make_tuple ( "Exact Knuth Morris Pratt (NonlinearPattern PrefixRankedBar)",
+				"arbology::exact::KnuthMorrisPratt (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern)$pattern", 1000 ),
+		std::make_tuple ( "Exact Knuth Morris Pratt (NonlinearPattern PrefixRanked)",
+				"arbology::exact::KnuthMorrisPratt (PrefixRankedTree)$subject (PrefixRankedNonlinearPattern)$pattern", 1000 ),
 		std::make_tuple ( "Exact Boyer Moore Horspool (NonlinearPattern PrefixRankedBar)",
 				"arbology::exact::BoyerMooreHorspool (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern) <(tree::GeneralAlphabet::add $pattern <(tree::GeneralAlphabet::get $subject))", 1000 ),
 		std::make_tuple ( "Exact Reversed Boyer Moore Horspool (NonlinearPattern PrefixRankedBar)",
-- 
GitLab