当前位置: 首页 > news >正文

只用php做网站简单网页

只用php做网站,简单网页,做网站代码第一不,百度做网站多少钱能做首先我们需要给原来代码打个补丁#xff0c;在SelectScan 结构体初始化时需要传入 UpdateScan 接口对象#xff0c;但很多时候我们需要传入的是 Scan 对象#xff0c;因此我们需要做一个转换#xff0c;也就是当初始化 SelectScan 时#xff0c;如果传入的是 Scan 对象在SelectScan 结构体初始化时需要传入 UpdateScan 接口对象但很多时候我们需要传入的是 Scan 对象因此我们需要做一个转换也就是当初始化 SelectScan 时如果传入的是 Scan 对象那么我们就将其封装成 UpdateScan 接口对象因此在 query 目录下增加一个名为 updatescan_wrapper.go 的文件在其中输入内容如下: package queryimport (record_manager )type UpdateScanWrapper struct {scan Scan }func NewUpdateScanWrapper(s Scan) *UpdateScanWrapper {return UpdateScanWrapper{scan: s,} }func (u *UpdateScanWrapper) GetScan() Scan {return u.scan }func (u *UpdateScanWrapper) SetInt(fldName string, val int) {//DO NOTHING }func (u *UpdateScanWrapper) SetString(fldName string, val string) {//DO NOTHING }func (u *UpdateScanWrapper) SetVal(fldName string, val *Constant) {//DO NOTHING }func (u *UpdateScanWrapper) Insert() {//DO NOTHING }func (u *UpdateScanWrapper) Delete() {//DO NOTHING }func (u *UpdateScanWrapper) GetRid() *record_manager.RID {return nil }func (u *UpdateScanWrapper) MoveToRid(rid *record_manager.RID) {// DO NOTHING } 上面代码逻辑简单如果调用 Scan 对象接口时他直接调用其 Scan 内部对象的接口如果调用到 UpdateScan 的接口那么它什么都不做。完成上面代码后我们在select_plan.go 中进行一些修改 func (s *SelectPlan) Open() interface{} {scan : s.p.Open()updateScan, ok : scan.(query.UpdateScan)if !ok {updateScanWrapper : query.NewUpdateScanWrapper(scan.(query.Scan))return query.NewSelectionScan(updateScanWrapper, s.pred)}return query.NewSelectionScan(updateScan, s.pred) }上面代码在创建 SelectScan 对象时先判断传进来的对象是否能类型转换为 UpdateScan如果不能那意味着s.p.Open 获取的是 Scan 对象因此我们使用前面的代码封装一下再用来创建 SelectScan 对象。完成这里的修改后我们进入正题。 前面我们在实现 sql 解析器后在解析完一条查询语句后会创建一个 QueryData 对象本节我们看看如何根据这个对象构建出合适的查询规划器(Plan)。我们将采取由简单到负责的原则首先我们直接构建 QueryData 的信息去构建查询规划对象此时我们不考虑它所构造的查询树是否足够优化后面我们再慢慢改进构造算法直到算法能构建出足够优化的查询树。 我们先看一个具体例子假设我们现在有两个表 STUDENT, EXAM第一个表包含两个字段分别是学生 id 和姓名 idname1Tom2Jim3John 第二个表包含的是学生 id,科目名称考试乘机 stuidexamgrad1mathA1algorithmB2writingC2physicsC3chemicalB3englishC 现在我们使用 sql 语句查询所有考试成绩得过 A 的学生 select name from STUDENT, EXAM where id student_id and gradA当 sql 解释器读取上面语句后他就会创建一个 QueryData 结构里面 Tables 对了就包含两个表的名字也就是 STUDENT, EXAM。由于这两个表不是视图因此上面代码中判断 if viewDef ! nil 不成立于是进入 else 部分也就是代码会为这两个表创建对应的 TablePlan 对象接下来直接对这两个表执行 Product 操作也就是将左边表的一行跟右边表的每一行合起来形成新表的一行Product 操作在 STUDENT 和 EXAM 表后所得结果如下 idnamestudent_idexamgrad1Tom1mathA1Tom1algorithmB1Tom2writingA1Tom2physicsC1Tom3chemicalB1Tom3englishA…………… 接下来代码创建 ScanSelect 对象在上面的表上接着获取该表的每一行然后检测该行的 id 字段是否跟 student_id 字段一样如果相同那么查看其 grad 字段如果该字段是’A’就将该行的 name 字段显示出来。 下面我们看看如何使用代码把上面描述的流程实现出来。首先我们先对接口进行定义在 Planner 目录下的 interface.go 文件中增加如下内容 type QueryPlanner interface {CreatePlan(data *query.QueryData, tx tx.Transaction) Plan }接着在 Planner 目录下创建文件 query_planner.go同时输入以下代码代码的实现逻辑将接下来的文章中进行说明 package plannerimport (metadata_managementparsertx )type BasicQueryPlanner struct {mdm *metadata_management.MetaDataManager }func CreateBasicQueryPlanner(mdm *metadata_management.MetaDataManager) QueryPlanner {return BasicQueryPlanner{mdm: mdm,} }func (b *BasicQueryPlanner) CreatePlan(data *parser.QueryData, tx *tx.Transaction) Plan {//1,直接创建 QueryData 对象中的表plans : make([]Plan, 0)tables : data.Tables()for _, tblname : range tables {//获取该表对应视图的 sql 代码viewDef : b.mdm.GetViewDef(tblname, tx)if viewDef ! nil {//直接创建表对应的视图parser : parser.NewSQLParser(viewDef)viewData : parser.Query()//递归的创建对应表的规划器plans append(plans, b.CreatePlan(viewData, tx))} else {plans append(plans, NewTablePlan(tx, tblname, b.mdm))}}//将所有表执行 Product 操作注意表的次序会对后续查询效率有重大影响但这里我们不考虑表的次序只是按照//给定表依次执行 Product 操作后续我们会在这里进行优化p : plans[0]plans plans[1:]for _, nextPlan : range plans {p NewProductPlan(p, nextPlan)}p NewSelectPlan(p, data.Pred())return NewProjectPlan(p, data.Fields()) } 上面代码中 QueryData就是解析器在解析 select 语句后生成的对象它的 Tables 数组包含了 select 语句要查询的表所以上面代码的 CreatePlan 函数先从 QueryData 对象获得 select 语句要查询的表然后使用遍历这些表使用 NewProductPlan 创建这些表对应的 Product 操作最后在 Product 的基础上我们再创建 SelectPlan这里我们就相当于使用 where 语句中的条件在 Product 操作基础上将满足条件的行选出来最后再创建 ProjectPlan将在选出的行基础上将需要的字段选择出来。 下面我们测试一下上面代码的效果首先在 main.go 中我们先把 student, exam 两个表构造出来代码如下 func createStudentTable() (*tx.Transation, *metadata_manager.MetaDataManager) {file_manager, _ : fm.NewFileManager(student, 2048)log_manager, _ : lm.NewLogManager(file_manager, logfile.log)buffer_manager : bmg.NewBufferManager(file_manager, log_manager, 3)tx : tx.NewTransation(file_manager, log_manager, buffer_manager)sch : record_manager.NewSchema()mdm : metadata_manager.NewMetaDataManager(false, tx)sch.AddStringField(name, 16)sch.AddIntField(id)layout : record_manager.NewLayoutWithSchema(sch)ts : query.NewTableScan(tx, student, layout)ts.BeforeFirst()for i : 1; i 3; i {ts.Insert() //指向一个可用插槽ts.SetInt(id, i)if i 1 {ts.SetString(name, Tom)}if i 2 {ts.SetString(name, Jim)}if i 3 {ts.SetString(name, John)}}mdm.CreateTable(student, sch, tx)exam_sch : record_manager.NewSchema()exam_sch.AddIntField(stuid)exam_sch.AddStringField(exam, 16)exam_sch.AddStringField(grad, 16)exam_layout : record_manager.NewLayoutWithSchema(exam_sch)ts query.NewTableScan(tx, exam, exam_layout)ts.BeforeFirst()ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 1)ts.SetString(exam, math)ts.SetString(grad, A)ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 1)ts.SetString(exam, algorithm)ts.SetString(grad, B)ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 2)ts.SetString(exam, writing)ts.SetString(grad, C)ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 2)ts.SetString(exam, physics)ts.SetString(grad, C)ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 3)ts.SetString(exam, chemical)ts.SetString(grad, B)ts.Insert() //指向一个可用插槽ts.SetInt(stuid, 3)ts.SetString(exam, english)ts.SetString(grad, C)mdm.CreateTable(exam, exam_sch, tx)return tx, mdm }然后我们用解析器解析select查询语句生成 QueryData 对象最后使用BasicQueryPlanner创建好执行树和对应的 Scan 接口对象最后我们调用 Scan 对象的 Next 接口来获取给定字段代码如下 func main() {//构造 student 表tx, mdm : createStudentTable()queryStr : select name from student, exam where id stuid and grad\A\p : parser.NewSQLParser(queryStr)queryData : p.Query()test_planner : planner.CreateBasicQueryPlanner(mdm)test_plan : test_planner.CreatePlan(queryData, tx)test_interface : (test_plan.Open())test_scan, _ : test_interface.(query.Scan)for test_scan.Next() {fmt.Printf(name: %s\n, test_scan.GetString(name))}} 上面代码运行后所得结果如下 从运行结果看到代码成功执行了 sql 语句并返回了所需要的字段。请感兴趣的同学在 B 站搜索 coding 迪斯尼通过视频的方式查看我的调试演示过程这样才能对代码的设计有更好的理解代码下载 链接: https://pan.baidu.com/s/16ftSp46cU5NLisScq-ftZg 提取码: js99
http://www.zqtcl.cn/news/675644/

相关文章:

  • asp网站表格代码国家信用信息公示系统陕西
  • 网站建设技术文档网站做二维码
  • 模板建站公司wordpress 换行无效
  • 网站建设付款方式镇江网站设计开发公司电话
  • 萍乡网站制作公司末备案网站如何做cdn
  • 做透水砖的网站西充县企业网站建设
  • 29网站建设全部厦门建设网站建站
  • 列出网站开发建设的步骤高端品牌女装连衣裙
  • 长沙设计网站建设搜索引擎优化平台
  • 网站建设 可以吗打开浏览器的网站
  • 惠州定制网站制作推荐chinacd wordpress第三性
  • 网站建设从初级到精通网站开发成本预算价目表
  • 网站程序开发上海高端网站开发站霸网络
  • 企业网站对网络营销的意义环保材料 技术支持 东莞网站建设
  • 房地产网站建设价格买卖网站
  • 网站宣传方案开发专业网站
  • 电子商务+网站建设wordpress首页幻灯
  • 网站建设表格的属性学校网站建设命名
  • 清远网站建设自学网站开发要多久
  • 可信网站 quot 验证能防范哪些安全.教育类app开发价格表
  • 网站设计服务流程深圳网站设计公司费用大概多少
  • 邮件网站怎么做的本地计算机做网站服务器
  • 自己建的网站打不开html5 手机网站 模版
  • 网站建设跟网站结构如何提高网站排名的方法
  • 网站模板 缓存商标网上开店创业计划书
  • 沧州网站建设微艾薇怎样给企业做网站
  • 如何做淘宝客的网站个人网站设计与制作代码
  • 信用门户网站建设观摩惠州专业做网站
  • wordpress打开网站前广告佛山百度推广seo服务
  • 松北建设局网站vps 用ip可以访问网站么