tanghai 14 лет назад
Родитель
Сommit
c1e5830a5c

+ 2 - 1
Cpp/Platform/CMakeLists.txt

@@ -1,3 +1,4 @@
 ADD_SUBDIRECTORY(Thread)
 ADD_SUBDIRECTORY(Rpc)
-ADD_SUBDIRECTORY(Mono)
+ADD_SUBDIRECTORY(Mono)
+ADD_SUBDIRECTORY(Orm)

+ 23 - 1
Cpp/Platform/Orm/CMakeLists.txt

@@ -1,7 +1,13 @@
+PROTOBUF_GENERATE_CPP(ProtoSrcs ProtoHdrs 
+	Person.proto
+)
+
 FILE(GLOB Header "*.h")
 
 SET(OrmSrc 
 	${Header}
+	${ProtoHdrs}
+	${ProtoSrcs}
 	Column.cc
 	DbHelper.cc
 	DbResult.cc
@@ -9,4 +15,20 @@ SET(OrmSrc
 	MessageField.cc
 )
 
-ADD_LIBRARY(Orm ${OrmSrc})
+ADD_LIBRARY(Orm ${OrmSrc})
+SET_PROPERTY(TARGET Orm PROPERTY FOLDER "Platform")
+
+ADD_EXECUTABLE(SelectTest SelectTest.cc)
+
+SET(Tests
+	SelectTest
+)
+
+FOREACH(Test ${Tests})
+	TARGET_LINK_LIBRARIES(${Test}
+		Orm
+		${ThirdPartyLibs}
+	)
+	ADD_TEST(${Test} ${Test})
+	SET_PROPERTY(TARGET ${Test} PROPERTY FOLDER "Tests/Platform/Orm")
+ENDFOREACH()

+ 11 - 2
Cpp/Platform/Orm/Column.cc

@@ -2,10 +2,19 @@
 
 namespace Egametang {
 
-Column::Column(const std::string name): columnStr(name)
+Column::Column()
 {
 }
 
+Column::Column(const std::string& name): columnStr(name)
+{
+}
+
+Column::Column(const Column& column)
+{
+	columnStr = column.columnStr;
+}
+
 Column::~Column()
 {
 }
@@ -16,7 +25,7 @@ Column& Column::operator()(std::string& name)
 	return *this;
 }
 
-bool Column::Empty()
+bool Column::Empty() const
 {
 	return columnStr.empty();
 }

+ 5 - 3
Cpp/Platform/Orm/Column.h

@@ -12,16 +12,18 @@ private:
 	std::string columnStr;
 
 public:
-	Column(const std::string name);
+	Column();
+	Column(const std::string& name);
+	Column(const Column& column);
 	~Column();
 	Column& operator()(std::string& name);
-	bool Empty();
+	bool Empty() const;
 	std::string ToString() const;
 
 	template <typename T>
 	Expr operator>(const T& value)
 	{
-		return Oper(*this,">", value);
+		return Oper(*this, ">", value);
 	}
 
 	template <typename T>

+ 2 - 1
Cpp/Platform/Orm/Expr.cc

@@ -2,6 +2,7 @@
 // Author: egametang@gmail.com (tanghai)
 
 #include <boost/lexical_cast.hpp>
+#include <glog/logging.h>
 #include "Orm/Column.h"
 #include "Orm/Expr.h"
 
@@ -17,7 +18,7 @@ Expr& Expr::operator=(const Expr& expr)
 	return *this;
 }
 
-bool Expr::Empty()
+bool Expr::Empty() const
 {
 	return exprStr.empty();
 }

+ 1 - 1
Cpp/Platform/Orm/Expr.h

@@ -17,7 +17,7 @@ public:
 	virtual ~Expr();
 	Expr& operator=(const Expr& expr);
 	std::string ToString() const;
-	bool Empty();
+	bool Empty() const;
 };
 
 class Not: public Expr

+ 2 - 2
Cpp/Platform/Orm/MessageField.cc

@@ -4,6 +4,8 @@
 #include <boost/lexical_cast.hpp>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/text_format.h>
+#include <glog/logging.h>
+#include <gflags/gflags.h>
 #include "Base/Typedef.h"
 #include "Orm/MessageField.h"
 
@@ -196,7 +198,6 @@ std::string MessageField::GetOptionalField()
 		}
 		default:
 		{
-			LOG(FATAL) << "no such type";
 			break;
 		}
 	}
@@ -377,7 +378,6 @@ void MessageField::SetOptionalField(ResultSetPtr resultSet)
 		}
 		default:
 		{
-			LOG(FATAL) << "no such type";
 			break;
 		}
 	}

+ 8 - 0
Cpp/Platform/Orm/Person.proto

@@ -0,0 +1,8 @@
+package Egametang;
+
+message Person
+{
+	optional int32 id = 1;
+	optional string name = 2;
+	optional int32 age = 3;
+}

+ 9 - 4
Cpp/Platform/Orm/Select.h

@@ -4,6 +4,7 @@
 #include <string>
 #include <vector>
 #include <boost/lexical_cast.hpp>
+#include <google/protobuf/descriptor.h>
 #include "Orm/Expr.h"
 #include "Orm/Column.h"
 
@@ -25,9 +26,10 @@ private:
 
 public:
 	Select(Column columns):
-			select(columns), distinct(false),
-			desc(false), limit(0),
-			offset(0)
+		select(columns), distinct(false),
+		groupBy(), orderBy(),
+		desc(false), limit(0),
+		offset(0)
 	{
 	}
 
@@ -125,5 +127,8 @@ public:
 	}
 };
 
-} // namespace Egametang
+
+}
+
+ // namespace Egametang
 #endif // ORM_QUERY_H

+ 58 - 0
Cpp/Platform/Orm/SelectTest.cc

@@ -1,5 +1,63 @@
+#include <gtest/gtest.h>
+#include <glog/logging.h>
+#include <gflags/gflags.h>
 #include "Orm/Select.h"
+#include "Orm/Person.pb.h"
 
 namespace Egametang {
 
+class RpcServerTest: public testing::Test
+{
+public:
+
+};
+
+TEST_F(RpcServerTest, ToString)
+{
+	std::string expectedSql;
+	expectedSql = "select * from Egametang.Person";
+	Select<Person> selectQuery1(Column("*"));
+	EXPECT_EQ(expectedSql, selectQuery1.ToString());
+
+	Select<Person> selectQuery2(Column("*"));
+	expectedSql = "select * from Egametang.Person where age > 10";
+	selectQuery2.Where(Column("age") > 10);
+	EXPECT_EQ(expectedSql, selectQuery2.ToString());
+
+	Select<Person> selectQuery3(Column("*"));
+	expectedSql = "select * distinct from Egametang.Person where age > 10";
+	selectQuery3.Distinct().Where(Column("age") > 10);
+	EXPECT_EQ(expectedSql, selectQuery3.ToString());
+
+	Select<Person> selectQuery4(Column("age, name"));
+	expectedSql = "select age, name distinct from Egametang.Person where age > 10";
+	selectQuery4.Distinct().Where(Column("age") > 10);
+	EXPECT_EQ(expectedSql, selectQuery4.ToString());
+
+	Select<Person> selectQuery5(Column("age, name"));
+	expectedSql = "select age, name distinct from Egametang.Person where age > 10 limit 1 offset 10";
+	selectQuery5.Distinct().Where(Column("age") > 10).Limit(1).Offset(10);
+	EXPECT_EQ(expectedSql, selectQuery5.ToString());
+
+	Select<Person> selectQuery6(Column("age, name"));
+	expectedSql =
+			"select age, name distinct from Egametang.Person"
+			" group by age having age > 10 limit 1 offset 10";
+	selectQuery6.Distinct()
+			.GroupBy(Column("age"))
+			.Having(Column("age") > 10)
+			.Limit(1)
+			.Offset(10);
+	EXPECT_EQ(expectedSql, selectQuery6.ToString());
+}
+
 } // namespace Egametang
+
+
+int main(int argc, char* argv[])
+{
+	testing::InitGoogleTest(&argc, argv);
+	google::InitGoogleLogging(argv[0]);
+	google::ParseCommandLineFlags(&argc, &argv, true);
+	return RUN_ALL_TESTS();
+}

+ 3 - 3
Cpp/Platform/Rpc/CMakeLists.txt

@@ -1,4 +1,4 @@
-PROTOBUF_GENERATE_CPP(proto_srcs proto_hdrs 
+PROTOBUF_GENERATE_CPP(ProtoSrcs ProtoHdrs 
 	Echo.proto
 )
 
@@ -6,8 +6,8 @@ FILE(GLOB Header "*.h")
 
 SET(RpcSrc 
 	${Header}
-	${proto_hdrs}
-	${proto_srcs}
+	${ProtoHdrs}
+	${ProtoSrcs}
 	RpcCommunicator.cc
 	RpcController.cc
 	RequestHandler.cc