@@ -95,4 +95,112 @@ public void mergeOptions() {
9595 assertThat (options .getMetadataMode ()).isEqualTo (org .springframework .ai .document .MetadataMode .ALL );
9696 }
9797
98+ @ Test
99+ public void builderWithEmptyKwargs () {
100+ PostgresMlEmbeddingOptions options = PostgresMlEmbeddingOptions .builder ().kwargs (Map .of ()).build ();
101+
102+ assertThat (options .getKwargs ()).isEmpty ();
103+ assertThat (options .getKwargs ()).isNotNull ();
104+ }
105+
106+ @ Test
107+ public void builderWithMultipleKwargs () {
108+ Map <String , Object > kwargs = Map .of ("device" , "gpu" , "batch_size" , 32 , "max_length" , 512 , "normalize" , true );
109+
110+ PostgresMlEmbeddingOptions options = PostgresMlEmbeddingOptions .builder ().kwargs (kwargs ).build ();
111+
112+ assertThat (options .getKwargs ()).hasSize (4 );
113+ assertThat (options .getKwargs ().get ("device" )).isEqualTo ("gpu" );
114+ assertThat (options .getKwargs ().get ("batch_size" )).isEqualTo (32 );
115+ assertThat (options .getKwargs ().get ("max_length" )).isEqualTo (512 );
116+ assertThat (options .getKwargs ().get ("normalize" )).isEqualTo (true );
117+ }
118+
119+ @ Test
120+ public void allVectorTypes () {
121+ for (PostgresMlEmbeddingModel .VectorType vectorType : PostgresMlEmbeddingModel .VectorType .values ()) {
122+ PostgresMlEmbeddingOptions options = PostgresMlEmbeddingOptions .builder ().vectorType (vectorType ).build ();
123+
124+ assertThat (options .getVectorType ()).isEqualTo (vectorType );
125+ }
126+ }
127+
128+ @ Test
129+ public void allMetadataModes () {
130+ for (org .springframework .ai .document .MetadataMode mode : org .springframework .ai .document .MetadataMode
131+ .values ()) {
132+ PostgresMlEmbeddingOptions options = PostgresMlEmbeddingOptions .builder ().metadataMode (mode ).build ();
133+
134+ assertThat (options .getMetadataMode ()).isEqualTo (mode );
135+ }
136+ }
137+
138+ @ Test
139+ public void mergeOptionsWithNullInput () {
140+ var jdbcTemplate = Mockito .mock (JdbcTemplate .class );
141+ PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel (jdbcTemplate );
142+
143+ PostgresMlEmbeddingOptions options = embeddingModel .mergeOptions (null );
144+
145+ // Should return default options when input is null
146+ assertThat (options .getTransformer ()).isEqualTo (PostgresMlEmbeddingModel .DEFAULT_TRANSFORMER_MODEL );
147+ assertThat (options .getVectorType ()).isEqualTo (PostgresMlEmbeddingModel .VectorType .PG_ARRAY );
148+ assertThat (options .getKwargs ()).isEqualTo (Map .of ());
149+ assertThat (options .getMetadataMode ()).isEqualTo (org .springframework .ai .document .MetadataMode .EMBED );
150+ }
151+
152+ @ Test
153+ public void mergeOptionsPreservesOriginal () {
154+ var jdbcTemplate = Mockito .mock (JdbcTemplate .class );
155+ PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel (jdbcTemplate );
156+
157+ PostgresMlEmbeddingOptions original = PostgresMlEmbeddingOptions .builder ()
158+ .transformer ("original-model" )
159+ .kwargs (Map .of ("original" , "value" ))
160+ .build ();
161+
162+ PostgresMlEmbeddingOptions merged = embeddingModel .mergeOptions (original );
163+
164+ // Verify original options are not modified
165+ assertThat (original .getTransformer ()).isEqualTo ("original-model" );
166+ assertThat (original .getKwargs ()).containsEntry ("original" , "value" );
167+
168+ // Verify merged options have expected values
169+ assertThat (merged .getTransformer ()).isEqualTo ("original-model" );
170+ }
171+
172+ @ Test
173+ public void mergeOptionsWithComplexKwargs () {
174+ var jdbcTemplate = Mockito .mock (JdbcTemplate .class );
175+ PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel (jdbcTemplate );
176+
177+ Map <String , Object > complexKwargs = Map .of ("device" , "cuda:0" , "model_kwargs" ,
178+ Map .of ("trust_remote_code" , true ), "encode_kwargs" ,
179+ Map .of ("normalize_embeddings" , true , "batch_size" , 64 ));
180+
181+ PostgresMlEmbeddingOptions options = embeddingModel
182+ .mergeOptions (PostgresMlEmbeddingOptions .builder ().kwargs (complexKwargs ).build ());
183+
184+ assertThat (options .getKwargs ()).hasSize (3 );
185+ assertThat (options .getKwargs ().get ("device" )).isEqualTo ("cuda:0" );
186+ assertThat (options .getKwargs ().get ("model_kwargs" )).isInstanceOf (Map .class );
187+ assertThat (options .getKwargs ().get ("encode_kwargs" )).isInstanceOf (Map .class );
188+ }
189+
190+ @ Test
191+ public void builderChaining () {
192+ PostgresMlEmbeddingOptions options = PostgresMlEmbeddingOptions .builder ()
193+ .transformer ("model-1" )
194+ .transformer ("model-2" ) // Should override previous value
195+ .vectorType (PostgresMlEmbeddingModel .VectorType .PG_VECTOR )
196+ .metadataMode (org .springframework .ai .document .MetadataMode .ALL )
197+ .kwargs (Map .of ("key1" , "value1" ))
198+ .kwargs (Map .of ("key2" , "value2" )) // Should override previous kwargs
199+ .build ();
200+
201+ assertThat (options .getTransformer ()).isEqualTo ("model-2" );
202+ assertThat (options .getKwargs ()).containsEntry ("key2" , "value2" );
203+ assertThat (options .getKwargs ()).doesNotContainKey ("key1" );
204+ }
205+
98206}
0 commit comments