@@ -95,4 +95,112 @@ public void mergeOptions() {
95
95
assertThat (options .getMetadataMode ()).isEqualTo (org .springframework .ai .document .MetadataMode .ALL );
96
96
}
97
97
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
+
98
206
}
0 commit comments