diff --git a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/layout/ForkPDFLayoutTextStripper.java b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/layout/ForkPDFLayoutTextStripper.java index c634b3e7a43..c5958fff1eb 100644 --- a/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/layout/ForkPDFLayoutTextStripper.java +++ b/document-readers/pdf-reader/src/main/java/org/springframework/ai/reader/pdf/layout/ForkPDFLayoutTextStripper.java @@ -18,7 +18,6 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -78,12 +77,11 @@ public void processPage(PDPage page) throws IOException { @Override protected void writePage() throws IOException { List> charactersByArticle = super.getCharactersByArticle(); - for (int i = 0; i < charactersByArticle.size(); i++) { - List textList = charactersByArticle.get(i); + for (List textList : charactersByArticle) { try { this.sortTextPositionList(textList); } - catch (java.lang.IllegalArgumentException e) { + catch (IllegalArgumentException e) { logger.error("Error sorting text positions", e); } this.iterateThroughTextList(textList.iterator()); @@ -106,7 +104,7 @@ private void writeToOutputStream(final List textLineList) throws IOExc */ private void sortTextPositionList(final List textList) { TextPositionComparator comparator = new TextPositionComparator(); - Collections.sort(textList, comparator); + textList.sort(comparator); } private void writeLine(final List textPositionList) { diff --git a/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java b/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java index aae301fe30f..eb8994fee8a 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java @@ -207,20 +207,16 @@ private PreparedStatement prepareGetStatement() { private Message getMessage(UdtValue udt) { String content = udt.getString(this.conf.messageUdtContentColumn); Map props = Map.of(CONVERSATION_TS, udt.getInstant(this.conf.messageUdtTimestampColumn)); - switch (MessageType.valueOf(udt.getString(this.conf.messageUdtTypeColumn))) { - case ASSISTANT: - return AssistantMessage.builder().content(content).properties(props).build(); - case USER: - return UserMessage.builder().text(content).metadata(props).build(); - case SYSTEM: - return SystemMessage.builder().text(content).metadata(props).build(); - case TOOL: + return switch (MessageType.valueOf(udt.getString(this.conf.messageUdtTypeColumn))) { + case ASSISTANT -> AssistantMessage.builder().content(content).properties(props).build(); + case USER -> UserMessage.builder().text(content).metadata(props).build(); + case SYSTEM -> SystemMessage.builder().text(content).metadata(props).build(); + case TOOL -> // todo – persist ToolResponse somehow - return ToolResponseMessage.builder().responses(List.of()).metadata(props).build(); - default: - throw new IllegalStateException( - String.format("unknown message type %s", udt.getString(this.conf.messageUdtTypeColumn))); - } + ToolResponseMessage.builder().responses(List.of()).metadata(props).build(); + default -> throw new IllegalStateException( + String.format("unknown message type %s", udt.getString(this.conf.messageUdtTypeColumn))); + }; } } diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java index da926fe610e..3c4e287ec2c 100644 --- a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java +++ b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java @@ -332,8 +332,7 @@ ConverseRequest createRequest(Prompt prompt) { .map(message -> { if (message.getMessageType() == MessageType.USER) { List contents = new ArrayList<>(); - if (message instanceof UserMessage) { - var userMessage = (UserMessage) message; + if (message instanceof UserMessage userMessage) { contents.add(ContentBlock.fromText(userMessage.getText())); if (!CollectionUtils.isEmpty(userMessage.getMedia())) { diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java index 7117a8370e1..d5a02691f90 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java @@ -81,18 +81,14 @@ public String toPrompt(List messages) { } protected String messageToString(Message message) { - switch (message.getMessageType()) { - case SYSTEM: - return message.getText(); - case USER: - return this.humanPrompt + " " + message.getText(); - case ASSISTANT: - return this.assistantPrompt + " " + message.getText(); - case TOOL: + return switch (message.getMessageType()) { + case SYSTEM -> message.getText(); + case USER -> this.humanPrompt + " " + message.getText(); + case ASSISTANT -> this.assistantPrompt + " " + message.getText(); + case TOOL -> throw new IllegalArgumentException("Tool execution results are not supported for Bedrock models"); - } + }; - throw new IllegalArgumentException("Unknown message type: " + message.getMessageType()); } } diff --git a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatModel.java b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatModel.java index b0098f21f7c..8e38008e859 100644 --- a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatModel.java +++ b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/GoogleGenAiChatModel.java @@ -250,16 +250,11 @@ private static GeminiMessageType toGeminiMessageType(@NonNull MessageType type) Assert.notNull(type, "Message type must not be null"); - switch (type) { - case SYSTEM: - case USER: - case TOOL: - return GeminiMessageType.USER; - case ASSISTANT: - return GeminiMessageType.MODEL; - default: - throw new IllegalArgumentException("Unsupported message type: " + type); - } + return switch (type) { + case SYSTEM, USER, TOOL -> GeminiMessageType.USER; + case ASSISTANT -> GeminiMessageType.MODEL; + default -> throw new IllegalArgumentException("Unsupported message type: " + type); + }; } static List messageToGeminiParts(Message message) { @@ -780,51 +775,38 @@ GeminiRequest createGeminiRequest(Prompt prompt) { // Helper methods for mapping safety settings enums private static com.google.genai.types.HarmCategory mapToGenAiHarmCategory( GoogleGenAiSafetySetting.HarmCategory category) { - switch (category) { - case HARM_CATEGORY_UNSPECIFIED: - return new com.google.genai.types.HarmCategory( - com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_UNSPECIFIED); - case HARM_CATEGORY_HATE_SPEECH: - return new com.google.genai.types.HarmCategory( - com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH); - case HARM_CATEGORY_DANGEROUS_CONTENT: - return new com.google.genai.types.HarmCategory( - com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_DANGEROUS_CONTENT); - case HARM_CATEGORY_HARASSMENT: - return new com.google.genai.types.HarmCategory( - com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HARASSMENT); - case HARM_CATEGORY_SEXUALLY_EXPLICIT: - return new com.google.genai.types.HarmCategory( - com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_SEXUALLY_EXPLICIT); - default: - throw new IllegalArgumentException("Unknown HarmCategory: " + category); - } + return switch (category) { + case HARM_CATEGORY_UNSPECIFIED -> new com.google.genai.types.HarmCategory( + com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_UNSPECIFIED); + case HARM_CATEGORY_HATE_SPEECH -> new com.google.genai.types.HarmCategory( + com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH); + case HARM_CATEGORY_DANGEROUS_CONTENT -> new com.google.genai.types.HarmCategory( + com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_DANGEROUS_CONTENT); + case HARM_CATEGORY_HARASSMENT -> new com.google.genai.types.HarmCategory( + com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_HARASSMENT); + case HARM_CATEGORY_SEXUALLY_EXPLICIT -> new com.google.genai.types.HarmCategory( + com.google.genai.types.HarmCategory.Known.HARM_CATEGORY_SEXUALLY_EXPLICIT); + default -> throw new IllegalArgumentException("Unknown HarmCategory: " + category); + }; } private static com.google.genai.types.HarmBlockThreshold mapToGenAiHarmBlockThreshold( GoogleGenAiSafetySetting.HarmBlockThreshold threshold) { - switch (threshold) { - case HARM_BLOCK_THRESHOLD_UNSPECIFIED: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.HARM_BLOCK_THRESHOLD_UNSPECIFIED); - case BLOCK_LOW_AND_ABOVE: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.BLOCK_LOW_AND_ABOVE); - case BLOCK_MEDIUM_AND_ABOVE: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.BLOCK_MEDIUM_AND_ABOVE); - case BLOCK_ONLY_HIGH: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.BLOCK_ONLY_HIGH); - case BLOCK_NONE: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.BLOCK_NONE); - case OFF: - return new com.google.genai.types.HarmBlockThreshold( - com.google.genai.types.HarmBlockThreshold.Known.OFF); - default: - throw new IllegalArgumentException("Unknown HarmBlockThreshold: " + threshold); - } + return switch (threshold) { + case HARM_BLOCK_THRESHOLD_UNSPECIFIED -> new com.google.genai.types.HarmBlockThreshold( + com.google.genai.types.HarmBlockThreshold.Known.HARM_BLOCK_THRESHOLD_UNSPECIFIED); + case BLOCK_LOW_AND_ABOVE -> new com.google.genai.types.HarmBlockThreshold( + com.google.genai.types.HarmBlockThreshold.Known.BLOCK_LOW_AND_ABOVE); + case BLOCK_MEDIUM_AND_ABOVE -> new com.google.genai.types.HarmBlockThreshold( + com.google.genai.types.HarmBlockThreshold.Known.BLOCK_MEDIUM_AND_ABOVE); + case BLOCK_ONLY_HIGH -> new com.google.genai.types.HarmBlockThreshold( + com.google.genai.types.HarmBlockThreshold.Known.BLOCK_ONLY_HIGH); + case BLOCK_NONE -> new com.google.genai.types.HarmBlockThreshold( + com.google.genai.types.HarmBlockThreshold.Known.BLOCK_NONE); + case OFF -> + new com.google.genai.types.HarmBlockThreshold(com.google.genai.types.HarmBlockThreshold.Known.OFF); + default -> throw new IllegalArgumentException("Unknown HarmBlockThreshold: " + threshold); + }; } private List toGeminiContent(List instructions) { diff --git a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiModalityTokenCount.java b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiModalityTokenCount.java index d9164f667db..827039dc6ef 100644 --- a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiModalityTokenCount.java +++ b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiModalityTokenCount.java @@ -70,19 +70,11 @@ private static String convertModality(MediaModality modality) { String modalityStr = modality.toString().toUpperCase(); // Map SDK values to cleaner names - switch (modalityStr) { - case "TEXT": - case "IMAGE": - case "VIDEO": - case "AUDIO": - case "DOCUMENT": - return modalityStr; - case "MODALITY_UNSPECIFIED": - case "MEDIA_MODALITY_UNSPECIFIED": - return "UNKNOWN"; - default: - return modalityStr; - } + return switch (modalityStr) { + case "TEXT", "IMAGE", "VIDEO", "AUDIO", "DOCUMENT" -> modalityStr; + case "MODALITY_UNSPECIFIED", "MEDIA_MODALITY_UNSPECIFIED" -> "UNKNOWN"; + default -> modalityStr; + }; } /** diff --git a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiTrafficType.java b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiTrafficType.java index ec496432da2..3e752d9b970 100644 --- a/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiTrafficType.java +++ b/models/spring-ai-google-genai/src/main/java/org/springframework/ai/google/genai/metadata/GoogleGenAiTrafficType.java @@ -63,22 +63,20 @@ public static GoogleGenAiTrafficType from(TrafficType trafficType) { String typeStr = trafficType.toString().toUpperCase(); // Map SDK values to our enum values - switch (typeStr) { - case "ON_DEMAND": - return ON_DEMAND; - case "PROVISIONED_THROUGHPUT": - return PROVISIONED_THROUGHPUT; - case "TRAFFIC_TYPE_UNSPECIFIED": - return UNKNOWN; - default: + return switch (typeStr) { + case "ON_DEMAND" -> ON_DEMAND; + case "PROVISIONED_THROUGHPUT" -> PROVISIONED_THROUGHPUT; + case "TRAFFIC_TYPE_UNSPECIFIED" -> UNKNOWN; + default -> { // Try exact match for (GoogleGenAiTrafficType type : values()) { if (type.value.equals(typeStr)) { - return type; + yield type; } } - return UNKNOWN; - } + yield UNKNOWN; + } + }; } /** diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java index 34ce6d1d7d6..f7314603ec3 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java @@ -457,18 +457,13 @@ MistralAiApi.ChatCompletionRequest createRequest(Prompt prompt, boolean stream) } private Stream createChatCompletionMessages(Message message) { - switch (message.getMessageType()) { - case USER: - return Stream.of(createUserChatCompletionMessage(message)); - case SYSTEM: - return Stream.of(createSystemChatCompletionMessage(message)); - case ASSISTANT: - return Stream.of(createAssistantChatCompletionMessage(message)); - case TOOL: - return createToolChatCompletionMessages(message); - default: - throw new IllegalStateException("Unknown message type: " + message.getMessageType()); - } + return switch (message.getMessageType()) { + case USER -> Stream.of(createUserChatCompletionMessage(message)); + case SYSTEM -> Stream.of(createSystemChatCompletionMessage(message)); + case ASSISTANT -> Stream.of(createAssistantChatCompletionMessage(message)); + case TOOL -> createToolChatCompletionMessages(message); + default -> throw new IllegalStateException("Unknown message type: " + message.getMessageType()); + }; } private Stream createToolChatCompletionMessages(Message message) { diff --git a/models/spring-ai-stability-ai/src/main/java/org/springframework/ai/stabilityai/StabilityAiImageModel.java b/models/spring-ai-stability-ai/src/main/java/org/springframework/ai/stabilityai/StabilityAiImageModel.java index 233d108f8cf..bd16577e542 100644 --- a/models/spring-ai-stability-ai/src/main/java/org/springframework/ai/stabilityai/StabilityAiImageModel.java +++ b/models/spring-ai-stability-ai/src/main/java/org/springframework/ai/stabilityai/StabilityAiImageModel.java @@ -137,8 +137,7 @@ StabilityAiImageOptions mergeOptions(ImageOptions runtimeOptions, StabilityAiIma .seed(defaultOptions.getSeed()) .steps(defaultOptions.getSteps()) .stylePreset(ModelOptionsUtils.mergeOption(runtimeOptions.getStyle(), defaultOptions.getStylePreset())); - if (runtimeOptions instanceof StabilityAiImageOptions) { - StabilityAiImageOptions stabilityOptions = (StabilityAiImageOptions) runtimeOptions; + if (runtimeOptions instanceof StabilityAiImageOptions stabilityOptions) { // Handle Stability AI specific image options builder .cfgScale(ModelOptionsUtils.mergeOption(stabilityOptions.getCfgScale(), defaultOptions.getCfgScale())) diff --git a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java index 8ad6a0aa39d..d5a4e485ead 100644 --- a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java +++ b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java @@ -244,16 +244,11 @@ private static GeminiMessageType toGeminiMessageType(@NonNull MessageType type) Assert.notNull(type, "Message type must not be null"); - switch (type) { - case SYSTEM: - case USER: - case TOOL: - return GeminiMessageType.USER; - case ASSISTANT: - return GeminiMessageType.MODEL; - default: - throw new IllegalArgumentException("Unsupported message type: " + type); - } + return switch (type) { + case SYSTEM, USER, TOOL -> GeminiMessageType.USER; + case ASSISTANT -> GeminiMessageType.MODEL; + default -> throw new IllegalArgumentException("Unsupported message type: " + type); + }; } static List messageToGeminiParts(Message message) { diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java index 23fa93cca61..9c6f1bc5d3d 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java @@ -154,10 +154,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Categories)) { + if (!(o instanceof Categories that)) { return false; } - Categories that = (Categories) o; return this.sexual == that.sexual && this.hate == that.hate && this.harassment == that.harassment && this.selfHarm == that.selfHarm && this.sexualMinors == that.sexualMinors && this.hateThreatening == that.hateThreatening && this.violenceGraphic == that.violenceGraphic diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java index 328e2e8682e..aceea7dcab9 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java @@ -155,10 +155,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof CategoryScores)) { + if (!(o instanceof CategoryScores that)) { return false; } - CategoryScores that = (CategoryScores) o; return Double.compare(that.sexual, this.sexual) == 0 && Double.compare(that.hate, this.hate) == 0 && Double.compare(that.harassment, this.harassment) == 0 && Double.compare(that.selfHarm, this.selfHarm) == 0 diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java index 18bb5f9d64d..3c33216e6cf 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java @@ -70,10 +70,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof Moderation)) { + if (!(o instanceof Moderation that)) { return false; } - Moderation that = (Moderation) o; return Objects.equals(this.id, that.id) && Objects.equals(this.model, that.model) && Objects.equals(this.results, that.results); } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java index 335f9f5a16e..d5c857ab942 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java @@ -52,10 +52,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof ModerationMessage)) { + if (!(o instanceof ModerationMessage that)) { return false; } - ModerationMessage that = (ModerationMessage) o; return Objects.equals(this.text, that.text); } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java index 02514d4b9af..75cf3db2762 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java @@ -73,10 +73,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof ModerationPrompt)) { + if (!(o instanceof ModerationPrompt that)) { return false; } - ModerationPrompt that = (ModerationPrompt) o; return Objects.equals(this.message, that.message) && Objects.equals(this.moderationModelOptions, that.moderationModelOptions); } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java index 857a3a273ef..14000d6d032 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java @@ -73,10 +73,9 @@ public boolean equals(Object o) { if (this == o) { return true; } - if (!(o instanceof ModerationResult)) { + if (!(o instanceof ModerationResult that)) { return false; } - ModerationResult that = (ModerationResult) o; return this.flagged == that.flagged && Objects.equals(this.categories, that.categories) && Objects.equals(this.categoryScores, that.categoryScores); } diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBFilterExpressionConverter.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBFilterExpressionConverter.java index 3549f63af02..8b42adabde7 100644 --- a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBFilterExpressionConverter.java +++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBFilterExpressionConverter.java @@ -112,30 +112,19 @@ private void doSingleExpressionType(Filter.Expression expression, StringBuilder } private String getOperationSymbol(Filter.Expression exp) { - switch (exp.type()) { - case AND: - return " AND "; - case OR: - return " OR "; - case EQ: - return " = "; - case NE: - return " != "; - case LT: - return " < "; - case LTE: - return " <= "; - case GT: - return " > "; - case GTE: - return " >= "; - case IN: - return " IN "; - case NIN: - return " !IN "; - default: - throw new RuntimeException("Not supported expression type:" + exp.type()); - } + return switch (exp.type()) { + case AND -> " AND "; + case OR -> " OR "; + case EQ -> " = "; + case NE -> " != "; + case LT -> " < "; + case LTE -> " <= "; + case GT -> " > "; + case GTE -> " >= "; + case IN -> " IN "; + case NIN -> " !IN "; + default -> throw new RuntimeException("Not supported expression type:" + exp.type()); + }; } } diff --git a/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseAiSearchFilterExpressionConverter.java b/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseAiSearchFilterExpressionConverter.java index da25f13c1b6..00ed631d426 100644 --- a/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseAiSearchFilterExpressionConverter.java +++ b/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseAiSearchFilterExpressionConverter.java @@ -38,30 +38,19 @@ protected void doExpression(Expression expression, StringBuilder context) { } private String getOperationSymbol(Expression exp) { - switch (exp.type()) { - case AND: - return " AND "; - case OR: - return " OR "; - case EQ: - return " == "; - case NE: - return " != "; - case LT: - return " < "; - case LTE: - return " <= "; - case GT: - return " > "; - case GTE: - return " >= "; - case IN: - return " IN "; - case NIN: - return " NOT IN "; - default: - throw new RuntimeException("Not supported expression type: " + exp.type()); - } + return switch (exp.type()) { + case AND -> " AND "; + case OR -> " OR "; + case EQ -> " == "; + case NE -> " != "; + case LT -> " < "; + case LTE -> " <= "; + case GT -> " > "; + case GTE -> " >= "; + case IN -> " IN "; + case NIN -> " NOT IN "; + default -> throw new RuntimeException("Not supported expression type: " + exp.type()); + }; } @Override diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java index 6f2c6e6c768..d1187df07ee 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java @@ -301,17 +301,16 @@ private Document toDocument(Hit hit) { // more info on score/distance calculation // https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html#knn-similarity-search private double normalizeSimilarityScore(double score) { - switch (this.options.getSimilarity()) { - case l2_norm: + return switch (this.options.getSimilarity()) { + case l2_norm -> // the returned value of l2_norm is the opposite of the other functions // (closest to zero means more accurate), so to make it consistent // with the other functions the reverse is returned applying a "1-" // to the standard transformation - return (1 - (java.lang.Math.sqrt((1 / score) - 1))); + (1 - (Math.sqrt((1 / score) - 1))); // cosine and dot_product - default: - return (2 * score) - 1; - } + default -> (2 * score) - 1; + }; } public boolean indexExists() { diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java index a1baa0cac91..f5800fab601 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBSchemaValidator.java @@ -73,8 +73,11 @@ void validateTableSchema(String schemaName, String tableName, String idFieldName } catch (DataAccessException e) { logger.error("Error while validating database vector support {}", e.getMessage()); - logger.error("Failed to validate that database supports VECTOR.\n" + "Run the following SQL commands:\n" - + " SELECT @@version; \nAnd ensure that version is >= 11.7.1"); + logger.error(""" + Failed to validate that database supports VECTOR. + Run the following SQL commands: + SELECT @@version;\s + And ensure that version is >= 11.7.1"""); throw new IllegalStateException(e); } diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasFilterExpressionConverter.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasFilterExpressionConverter.java index 74de379d0f4..10ddf48a666 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasFilterExpressionConverter.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasFilterExpressionConverter.java @@ -64,30 +64,19 @@ private void doSingleExpressionType(Filter.Expression expression, StringBuilder } private String getOperationSymbol(Filter.Expression exp) { - switch (exp.type()) { - case AND: - return "$and"; - case OR: - return "$or"; - case EQ: - return "$eq"; - case NE: - return "$ne"; - case LT: - return "$lt"; - case LTE: - return "$lte"; - case GT: - return "$gt"; - case GTE: - return "$gte"; - case IN: - return "$in"; - case NIN: - return "$nin"; - default: - throw new RuntimeException("Not supported expression type:" + exp.type()); - } + return switch (exp.type()) { + case AND -> "$and"; + case OR -> "$or"; + case EQ -> "$eq"; + case NE -> "$ne"; + case LT -> "$lt"; + case LTE -> "$lte"; + case GT -> "$gt"; + case GTE -> "$gte"; + case IN -> "$in"; + case NIN -> "$nin"; + default -> throw new RuntimeException("Not supported expression type:" + exp.type()); + }; } @Override diff --git a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/SqlJsonPathFilterExpressionConverter.java b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/SqlJsonPathFilterExpressionConverter.java index 50cd3435e7f..fa7554e8455 100644 --- a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/SqlJsonPathFilterExpressionConverter.java +++ b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/SqlJsonPathFilterExpressionConverter.java @@ -54,28 +54,18 @@ protected void doExpression(final Filter.Expression expression, final StringBuil } private String getOperationSymbol(final Filter.Expression exp) { - switch (exp.type()) { - case AND: - return " && "; - case OR: - return " || "; - case EQ: - return " == "; - case NE: - return " != "; - case LT: - return " < "; - case LTE: - return " <= "; - case GT: - return " > "; - case GTE: - return " >= "; - case IN: - return " in "; - default: - throw new RuntimeException("Not supported expression type: " + exp.type()); - } + return switch (exp.type()) { + case AND -> " && "; + case OR -> " || "; + case EQ -> " == "; + case NE -> " != "; + case LT -> " < "; + case LTE -> " <= "; + case GT -> " > "; + case GTE -> " >= "; + case IN -> " in "; + default -> throw new RuntimeException("Not supported expression type: " + exp.type()); + }; } @Override diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorFilterExpressionConverter.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorFilterExpressionConverter.java index 7143e0a6443..5b3a67f5fe9 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorFilterExpressionConverter.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/pgvector/PgVectorFilterExpressionConverter.java @@ -78,26 +78,17 @@ private void handleNotIn(Expression expression, StringBuilder context) { } private String getOperationSymbol(Expression exp) { - switch (exp.type()) { - case AND: - return " && "; - case OR: - return " || "; - case EQ: - return " == "; - case NE: - return " != "; - case LT: - return " < "; - case LTE: - return " <= "; - case GT: - return " > "; - case GTE: - return " >= "; - default: - throw new RuntimeException("Not supported expression type: " + exp.type()); - } + return switch (exp.type()) { + case AND -> " && "; + case OR -> " || "; + case EQ -> " == "; + case NE -> " != "; + case LT -> " < "; + case LTE -> " <= "; + case GT -> " > "; + case GTE -> " >= "; + default -> throw new RuntimeException("Not supported expression type: " + exp.type()); + }; } @Override diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java index ab668a40276..ab86b666462 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantFilterExpressionConverter.java @@ -73,26 +73,17 @@ else if (expression.type() == ExpressionType.OR) { protected Condition parseComparison(Key key, Value value, Expression exp) { ExpressionType type = exp.type(); - switch (type) { - case EQ: - return buildEqCondition(key, value); - case NE: - return buildNeCondition(key, value); - case GT: - return buildGtCondition(key, value); - case GTE: - return buildGteCondition(key, value); - case LT: - return buildLtCondition(key, value); - case LTE: - return buildLteCondition(key, value); - case IN: - return buildInCondition(key, value); - case NIN: - return buildNInCondition(key, value); - default: - throw new RuntimeException("Unsupported expression type: " + type); - } + return switch (type) { + case EQ -> buildEqCondition(key, value); + case NE -> buildNeCondition(key, value); + case GT -> buildGtCondition(key, value); + case GTE -> buildGteCondition(key, value); + case LT -> buildLtCondition(key, value); + case LTE -> buildLteCondition(key, value); + case IN -> buildInCondition(key, value); + case NIN -> buildNInCondition(key, value); + default -> throw new RuntimeException("Unsupported expression type: " + type); + }; } protected Condition buildEqCondition(Key key, Value value) { diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java index d3233e666a0..2ba76fc4060 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantObjectFactory.java @@ -56,26 +56,19 @@ private static Object object(ListValue listValue) { private static Object object(Value value) { - switch (value.getKindCase()) { - case INTEGER_VALUE: - return value.getIntegerValue(); - case STRING_VALUE: - return value.getStringValue(); - case DOUBLE_VALUE: - return value.getDoubleValue(); - case BOOL_VALUE: - return value.getBoolValue(); - case LIST_VALUE: - return object(value.getListValue()); - case STRUCT_VALUE: - return toObjectMap(value.getStructValue().getFieldsMap()); - case NULL_VALUE: - return null; - case KIND_NOT_SET: - default: + return switch (value.getKindCase()) { + case INTEGER_VALUE -> value.getIntegerValue(); + case STRING_VALUE -> value.getStringValue(); + case DOUBLE_VALUE -> value.getDoubleValue(); + case BOOL_VALUE -> value.getBoolValue(); + case LIST_VALUE -> object(value.getListValue()); + case STRUCT_VALUE -> toObjectMap(value.getStructValue().getFieldsMap()); + case NULL_VALUE -> null; + default -> { logger.warn("Unsupported value type: " + value.getKindCase()); - return null; - } + yield null; + } + }; } diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java index 59e88d9e76b..88c16a2f041 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantValueFactory.java @@ -70,23 +70,17 @@ private static Value value(Object value) { return value((List) value); } - switch (value.getClass().getSimpleName()) { - case "String": - return ValueFactory.value((String) value); - case "Integer": - return ValueFactory.value((Integer) value); - case "Long": + return switch (value.getClass().getSimpleName()) { + case "String" -> ValueFactory.value((String) value); + case "Integer" -> ValueFactory.value((Integer) value); + case "Long" -> // use String representation - return ValueFactory.value(String.valueOf(value)); - case "Double": - return ValueFactory.value((Double) value); - case "Float": - return ValueFactory.value((Float) value); - case "Boolean": - return ValueFactory.value((Boolean) value); - default: - throw new IllegalArgumentException("Unsupported Qdrant value type: " + value.getClass()); - } + ValueFactory.value(String.valueOf(value)); + case "Double" -> ValueFactory.value((Double) value); + case "Float" -> ValueFactory.value((Float) value); + case "Boolean" -> ValueFactory.value((Boolean) value); + default -> throw new IllegalArgumentException("Unsupported Qdrant value type: " + value.getClass()); + }; } private static Value value(List elements) {