77use Doctrine \DBAL \Types \Type ;
88use Doctrine \ORM \EntityManager ;
99use Doctrine \ORM \ORMSetup ;
10+ use Doctrine \ORM \Query \ResultSetMappingBuilder ;
1011use Doctrine \ORM \Tools \SchemaTool ;
1112use Pgvector \HalfVector ;
1213use Pgvector \SparseVector ;
@@ -56,6 +57,12 @@ public static function setUpBeforeClass(): void
5657 self ::$ em = $ entityManager ;
5758 }
5859
60+ public function setUp (): void
61+ {
62+ self ::$ em ->getConnection ()->executeStatement ('TRUNCATE doctrine_items RESTART IDENTITY ' );
63+ self ::$ em ->clear ();
64+ }
65+
5966 public function testTypes ()
6067 {
6168 $ item = new DoctrineItem ();
@@ -73,4 +80,48 @@ public function testTypes()
7380 $ this ->assertEquals ('101 ' , $ item ->getBinaryEmbedding ());
7481 $ this ->assertEquals ([7 , 8 , 9 ], $ item ->getSparseEmbedding ()->toArray ());
7582 }
83+
84+ public function testVectorL2Distance ()
85+ {
86+ $ this ->createItems ();
87+ $ rsm = new ResultSetMappingBuilder (self ::$ em );
88+ $ rsm ->addRootEntityFromClassMetadata ('DoctrineItem ' , 'i ' );
89+ $ neighbors = self ::$ em ->createNativeQuery ('SELECT * FROM doctrine_items i ORDER BY embedding <-> ? LIMIT 5 ' , $ rsm )
90+ ->setParameter (1 , new Vector ([1 , 1 , 1 ]))
91+ ->getResult ();
92+ $ this ->assertEquals ([1 , 3 , 2 ], array_map (fn ($ v ) => $ v ->getId (), $ neighbors ));
93+ $ this ->assertEquals ([[1 , 1 , 1 ], [1 , 1 , 2 ], [2 , 2 , 2 ]], array_map (fn ($ v ) => $ v ->getEmbedding ()->toArray (), $ neighbors ));
94+ }
95+
96+ public function testVectorMaxInnerProduct ()
97+ {
98+ $ this ->createItems ();
99+ $ rsm = new ResultSetMappingBuilder (self ::$ em );
100+ $ rsm ->addRootEntityFromClassMetadata ('DoctrineItem ' , 'i ' );
101+ $ neighbors = self ::$ em ->createNativeQuery ('SELECT * FROM doctrine_items i ORDER BY embedding <#> ? LIMIT 5 ' , $ rsm )
102+ ->setParameter (1 , new Vector ([1 , 1 , 1 ]))
103+ ->getResult ();
104+ $ this ->assertEquals ([2 , 3 , 1 ], array_map (fn ($ v ) => $ v ->getId (), $ neighbors ));
105+ }
106+
107+ public function testVectorCosineDistance ()
108+ {
109+ $ this ->createItems ();
110+ $ rsm = new ResultSetMappingBuilder (self ::$ em );
111+ $ rsm ->addRootEntityFromClassMetadata ('DoctrineItem ' , 'i ' );
112+ $ neighbors = self ::$ em ->createNativeQuery ('SELECT * FROM doctrine_items i ORDER BY embedding <=> ? LIMIT 5 ' , $ rsm )
113+ ->setParameter (1 , new Vector ([1 , 1 , 1 ]))
114+ ->getResult ();
115+ $ this ->assertEquals ([1 , 2 , 3 ], array_map (fn ($ v ) => $ v ->getId (), $ neighbors ));
116+ }
117+
118+ private function createItems ()
119+ {
120+ foreach ([[1 , 1 , 1 ], [2 , 2 , 2 ], [1 , 1 , 2 ]] as $ i => $ v ) {
121+ $ item = new DoctrineItem ();
122+ $ item ->setEmbedding (new Vector ($ v ));
123+ self ::$ em ->persist ($ item );
124+ }
125+ self ::$ em ->flush ();
126+ }
76127}
0 commit comments