From b01c739f51d9eb7c5ea60b893537d273fc7c4910 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Wed, 4 Apr 2018 12:59:38 +0200
Subject: [PATCH] fix S |S related issues in use of compressed bit parallel
 index

---
 .../query/CompressedBitParallelismPatterns.h  | 19 +++++++++++++++++++
 ...onlinearCompressedBitParallelismPatterns.h | 10 ++++++++++
 2 files changed, 29 insertions(+)

diff --git a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h
index 66a9f6b935..fe8d6b5e5e 100644
--- a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h
+++ b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h
@@ -42,6 +42,15 @@ template < class SymbolType, class RankType >
 ext::set < unsigned > CompressedBitParallelismPatterns::query ( const indexes::arbology::CompressedBitParallelTreeIndex < SymbolType, RankType > & compressedBitParallelIndex, const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ) {
 	auto symbolIter = pattern.getContent ( ).begin ( );
 
+	if ( pattern.getSubtreeWildcard ( ) == * symbolIter ) {
+		ext::set < unsigned > res;
+
+		for ( size_t i = 0; i < compressedBitParallelIndex.getJumps ( ).size ( ); ++ i )
+			res.insert ( i );
+
+		return res;
+	}
+
 	typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = compressedBitParallelIndex.getData ( ).find ( * symbolIter );
 
 	if ( symbolVectorIter == compressedBitParallelIndex.getData ( ).end ( ) )
@@ -80,6 +89,16 @@ template < class SymbolType, class RankType >
 ext::set < unsigned > CompressedBitParallelismPatterns::query ( const indexes::arbology::CompressedBitParallelTreeIndex < SymbolType, RankType > & compressedBitParallelIndex, const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) {
 	auto symbolIter = pattern.getContent ( ).begin ( );
 
+	if ( pattern.getSubtreeWildcard ( ) == * symbolIter ) {
+		ext::set < unsigned > res;
+
+		for ( size_t i = 0; i < compressedBitParallelIndex.getJumps ( ).size ( ) - 1; ++ i ) //last index maps to -1
+			if ( ( size_t ) compressedBitParallelIndex.getJumps ( ) [ i ] > i )
+				res.insert ( i );
+
+		return res;
+	}
+
 	typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = compressedBitParallelIndex.getData ( ).find ( * symbolIter );
 
 	if ( symbolVectorIter == compressedBitParallelIndex.getData ( ).end ( ) )
diff --git a/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h b/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h
index 4993f30b89..b6d10446bf 100644
--- a/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h
+++ b/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h
@@ -70,6 +70,16 @@ template < class SymbolType, class RankType >
 ext::set < unsigned > NonlinearCompressedBitParallelismPatterns::query ( const indexes::arbology::NonlinearCompressedBitParallelTreeIndex < SymbolType, RankType > & nonlinearCompressedBitParallelIndex, const tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern ) {
 	auto symbolIter = pattern.getContent ( ).begin ( );
 
+	if ( pattern.getSubtreeWildcard ( ) == * symbolIter || pattern.getNonlinearVariables ( ).count ( * symbolIter ) ) {
+		ext::set < unsigned > res;
+
+		for ( size_t i = 0; i < nonlinearCompressedBitParallelIndex.getJumps ( ).size ( ) - 1; ++ i ) //last index maps to -1
+			if ( ( size_t ) nonlinearCompressedBitParallelIndex.getJumps ( ) [ i ] > i )
+				res.insert ( i );
+
+		return res;
+	}
+
 	typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = nonlinearCompressedBitParallelIndex.getData ( ).find ( * symbolIter );
 
 	if ( symbolVectorIter == nonlinearCompressedBitParallelIndex.getData ( ).end ( ) )
-- 
GitLab