本文整理汇总了Golang中github.com/couchbase/query/algebra.Subselect.Projection方法的典型用法代码示例。如果您正苦于以下问题:Golang Subselect.Projection方法的具体用法?Golang Subselect.Projection怎么用?Golang Subselect.Projection使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/couchbase/query/algebra.Subselect
的用法示例。
在下文中一共展示了Subselect.Projection方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: fastCount
func (this *builder) fastCount(node *algebra.Subselect) (bool, error) {
if node.From() == nil ||
node.Where() != nil ||
node.Group() != nil {
return false, nil
}
from, ok := node.From().(*algebra.KeyspaceTerm)
if !ok ||
from.Projection() != nil ||
from.Keys() != nil {
return false, nil
}
from.SetDefaultNamespace(this.namespace)
keyspace, err := this.getTermKeyspace(from)
if err != nil {
return false, err
}
for _, term := range node.Projection().Terms() {
count, ok := term.Expression().(*algebra.Count)
if !ok || count.Operand() != nil {
return false, nil
}
}
scan := plan.NewCountScan(keyspace, from)
this.children = append(this.children, scan)
return true, nil
}
示例2: allAggregates
func allAggregates(node *algebra.Subselect, order *algebra.Order) (map[string]algebra.Aggregate, error) {
aggs := make(map[string]algebra.Aggregate)
if node.Let() != nil {
for _, binding := range node.Let() {
collectAggregates(aggs, binding.Expression())
if len(aggs) > 0 {
return nil, fmt.Errorf("Aggregates not allowed in LET.")
}
}
}
if node.Where() != nil {
collectAggregates(aggs, node.Where())
if len(aggs) > 0 {
return nil, fmt.Errorf("Aggregates not allowed in WHERE.")
}
}
group := node.Group()
if group != nil {
letting := group.Letting()
for _, binding := range letting {
collectAggregates(aggs, binding.Expression())
}
having := group.Having()
if having != nil {
collectAggregates(aggs, having)
}
}
projection := node.Projection()
if projection != nil {
for _, term := range projection.Terms() {
if term.Expression() != nil {
collectAggregates(aggs, term.Expression())
}
}
}
if order != nil {
allow := len(aggs) > 0
for _, term := range order.Terms() {
if term.Expression() != nil {
collectAggregates(aggs, term.Expression())
}
}
if !allow && len(aggs) > 0 {
return nil, fmt.Errorf("Aggregates not available for this ORDER BY.")
}
}
return aggs, nil
}
示例3: VisitSubselect
func (this *builder) VisitSubselect(node *algebra.Subselect) (interface{}, error) {
prevCover := this.cover
prevCorrelated := this.correlated
defer func() {
this.cover = prevCover
this.correlated = prevCorrelated
}()
this.correlated = node.IsCorrelated()
if this.cover == nil {
this.cover = node
}
aggs, err := allAggregates(node, this.order)
if err != nil {
return nil, err
}
this.where = node.Where()
group := node.Group()
if group == nil && len(aggs) > 0 {
group = algebra.NewGroup(nil, nil, nil)
this.where = constrainAggregate(this.where, aggs)
}
this.children = make([]plan.Operator, 0, 16) // top-level children, executed sequentially
this.subChildren = make([]plan.Operator, 0, 16) // sub-children, executed across data-parallel streams
err = this.visitFrom(node, group)
if err != nil {
return nil, err
}
if this.coveringScan != nil {
coverer := expression.NewCoverer(this.coveringScan.Covers())
err = this.cover.MapExpressions(coverer)
if err != nil {
return nil, err
}
if this.where != nil {
this.where, err = coverer.Map(this.where)
if err != nil {
return nil, err
}
}
}
if node.Let() != nil {
this.subChildren = append(this.subChildren, plan.NewLet(node.Let()))
}
if node.Where() != nil {
this.subChildren = append(this.subChildren, plan.NewFilter(node.Where()))
}
if group != nil {
this.visitGroup(group, aggs)
}
projection := node.Projection()
this.subChildren = append(this.subChildren, plan.NewInitialProject(projection))
// Initial DISTINCT (parallel)
if projection.Distinct() || this.distinct {
this.subChildren = append(this.subChildren, plan.NewDistinct())
}
if !this.delayProjection {
// Perform the final projection if there is no subsequent ORDER BY
this.subChildren = append(this.subChildren, plan.NewFinalProject())
}
// Parallelize the subChildren
this.children = append(this.children, plan.NewParallel(plan.NewSequence(this.subChildren...), this.maxParallelism))
// Final DISTINCT (serial)
if projection.Distinct() || this.distinct {
this.children = append(this.children, plan.NewDistinct())
}
// Serialize the top-level children
return plan.NewSequence(this.children...), nil
}