diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java index c833e3fff4b..f51bc7e1821 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java @@ -18,27 +18,10 @@ /** * HSQLDB-specific SQL dialect for chat memory repository. + * + * @author Mark Pollack + * @author Yanming Zhou */ public class HsqldbChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { - @Override - public String getSelectMessagesSql() { - return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY timestamp ASC"; - } - - @Override - public String getInsertMessageSql() { - return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, timestamp) VALUES (?, ?, ?, ?)"; - } - - @Override - public String getDeleteMessagesSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; - } - - @Override - public String getSelectConversationIdsSql() { - return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; - } - } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java index 98533498da4..f9f3d7bb3ec 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java @@ -20,6 +20,9 @@ /** * Abstraction for database-specific SQL for chat memory repository. + * + * @author Mark Pollack + * @author Yanming Zhou */ public interface JdbcChatMemoryRepositoryDialect { @@ -27,22 +30,39 @@ public interface JdbcChatMemoryRepositoryDialect { * Returns the SQL to fetch messages for a conversation, ordered by timestamp, with * limit. */ - String getSelectMessagesSql(); + default String getSelectMessagesSql() { + return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY " + + escape("timestamp") + " ASC"; + } /** * Returns the SQL to insert a message. */ - String getInsertMessageSql(); + default String getInsertMessageSql() { + return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, " + escape("timestamp") + + ") VALUES (?, ?, ?, ?)"; + } /** * Returns the SQL to fetch conversation IDs. */ - String getSelectConversationIdsSql(); + default String getSelectConversationIdsSql() { + return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; + } /** * Returns the SQL to delete all messages for a conversation. */ - String getDeleteMessagesSql(); + default String getDeleteMessagesSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + } + + /** + * Escape keywords as column name. + */ + default String escape(String identifier) { + return identifier; + } /** * Optionally, dialect can provide more advanced SQL as needed. diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java index 045bb1f5ed2..2ca9e6f65b5 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java @@ -20,28 +20,14 @@ * MySQL dialect for chat memory repository. * * @author Mark Pollack + * @author Yanming Zhou * @since 1.0.0 */ public class MysqlChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { @Override - public String getSelectMessagesSql() { - return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY `timestamp`"; - } - - @Override - public String getInsertMessageSql() { - return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, `timestamp`) VALUES (?, ?, ?, ?)"; - } - - @Override - public String getSelectConversationIdsSql() { - return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; - } - - @Override - public String getDeleteMessagesSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + public String escape(String identifier) { + return "`" + identifier + "`"; } } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java index b22d298be6f..fcba19e2523 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java @@ -20,28 +20,14 @@ * Dialect for Postgres. * * @author Mark Pollack + * @author Yanming Zhou * @since 1.0.0 */ public class PostgresChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { @Override - public String getSelectMessagesSql() { - return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\""; - } - - @Override - public String getInsertMessageSql() { - return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, \"timestamp\") VALUES (?, ?, ?, ?)"; - } - - @Override - public String getSelectConversationIdsSql() { - return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; - } - - @Override - public String getDeleteMessagesSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + public String escape(String identifier) { + return "\"" + identifier + "\""; } } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java index dcc477fb078..3d1e77ea065 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java @@ -20,28 +20,14 @@ * Dialect for SQL Server. * * @author Mark Pollack + * @author Yanming Zhou * @since 1.0.0 */ public class SqlServerChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { @Override - public String getSelectMessagesSql() { - return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY [timestamp]"; - } - - @Override - public String getInsertMessageSql() { - return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, [timestamp]) VALUES (?, ?, ?, ?)"; - } - - @Override - public String getSelectConversationIdsSql() { - return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; - } - - @Override - public String getDeleteMessagesSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + public String escape(String identifier) { + return "[" + identifier + "]"; } }