Text index in IxSet

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 (?)

+4
source share
1 answer

Yes, IxSet seems to combine equal values. I took the first example and modified it so that it would do:

  where items = [ TaggedItem "tag,tag1,tag2" , TaggedItem "tag,tag3,tag4" , TaggedItem "tag,tag5,tag6" ] 

And now it also works.

+4
source

All Articles