I don't seem to understand how a text index should work in IxSet . Here I created unit-test, which indexes the elements in the tags field, and then queries the elements for the tag. It should (from my point of view) return to me all 3 elements (because they all have a tag), but it seems they do not. And I donβt understand why.
{-# LANGUAGE DeriveDataTypeable #-} import Test.HUnit import Data.IxSet import Data.List.Split ( splitOn ) import Data.Data ( Data, Typeable ) data TaggedItem = TaggedItem { getTags :: String } deriving ( Show, Ord, Eq, Data, Typeable ) data Tag = Tag String deriving ( Show, Ord, Eq, Data, Typeable ) getTagStrings :: TaggedItem -> [Tag] getTagStrings = map Tag . splitOn "," . getTags instance Indexable TaggedItem where empty = ixSet [ ixFun getTagStrings ] test3 = TestCase ( assertEqual "ixFun multiple tags test" 3 (size (index @= (Tag "tag"))) ) where items = [ TaggedItem "tag,tag1,tag2" , TaggedItem "tag,tag1,tag2" , TaggedItem "tag,tag1,tag2" ] index = fromList items tests = TestList [ -- TestLabel "test1" test1, -- TestLabel "test2" test2, TestLabel "test3" test3] main = do runTestTT tests
Update:
Hmm, pretty interesting. I added the "name" field and made for each element name different, and now it works.
{-# LANGUAGE DeriveDataTypeable #-} import Test.HUnit import Data.IxSet import Data.List.Split ( splitOn ) import Data.Data ( Data, Typeable ) newtype TaggedItemName = TaggedItemName { unTaggedItemName :: String } deriving ( Show, Ord, Eq, Data, Typeable ) data TaggedItem = TaggedItem { getName :: TaggedItemName, getTags :: String } deriving ( Show, Ord, Eq, Data, Typeable ) data Tag = Tag String deriving ( Show, Ord, Eq, Data, Typeable ) getTagStrings :: TaggedItem -> [Tag] getTagStrings = map Tag . splitOn "," . getTags instance Indexable TaggedItem where empty = ixSet [ ixFun getTagStrings ] test3 = TestCase ( assertEqual "ixFun multiple tags test" 3 (size (index @= (Tag "tag"))) ) where items = [ TaggedItem (TaggedItemName "name1") "tag,tag1,tag2" , TaggedItem (TaggedItemName "name2") "tag,tag1,tag2" , TaggedItem (TaggedItemName "name3") "tag,tag1,tag2" ] index = fromList items tests = TestList [ -- TestLabel "test1" test1, -- TestLabel "test2" test2, TestLabel "test3" test3] main = do runTestTT tests
Works. Therefore, perhaps, IxSet considered these elements to be the same and somehow merged them (?)