标签: aggregate

是否可以从聚合工厂调用规范进行验证,或者该验证调用是否属于单元测试(DDD)?

我创建了一个工厂和一组规范来创建和验证聚合根.目前我对工厂进行了一些测试,这些测试称工厂的产品规格,但我想知道这是否足够.从设计的角度来看,将工厂与其产品的规格相结合可能会更好,因为它们密切相关.

如果聚合根产品的规范用于验证而不是用于创建,那么从工厂内部调用它是否有意义?

或者单位测试是否足够好?

validation domain-driven-design aggregate specification-pattern factory-pattern

8
推荐指数
1
解决办法
456
查看次数

C#会从聚合结构/类中受益吗?

前言

tl; wr:这是一个讨论.

我知道这个"问题"更多的是讨论,因此我将其标记为社区维基.但是,根据" 如何询问"页面,它可能属于此处,因为它具体与编程相关,经过一个小时的研究后无法在网络上讨论,具体而言,与大多数C#程序员和主题相关.而且,这个问题本身就是为了获得答案,不管我的偏见,我都会保持开放的态度:C#真的会从总体结构中受益吗?尽管有这一前言,但我知道这是关闭的,但如果有权限和意图关闭的用户将我重定向到Web上的适当讨论点,我将不胜感激.


介绍


缺乏结构可变性

结构是C#中的灵活但有争议的类型.它们提供堆栈分配的值类型组织范例,但不提供其他值类型的不变性.

有人说结构应该代表值,而值不会改变(例如int i = 5;,5是不可变的),而有些人认为它们是带有子字段的OOP布局.

上结构不变性(辩论1,2,3),为此,当前的解决方案似乎具有程序员执行不变性,也没有解决.

例如,当结构作为引用(本页底部)访问并限制赋值时,C#编译器将检测可能的数据丢失.此外,由于结构构造函数,属性和函数能够执行任何操作,在返回控件之前使用限制(对于构造函数)分配所有字段,结构不能声明为常量,如果它们仅限于数据表示.


不可变的结构子集,聚合

聚合类(维基百科)是严格的数据结构,功能有限,注定会因缺乏灵活性而在对应方面提供语法糖.在C++中,它们"没有用户声明的构造函数,没有私有或受保护的非静态数据成员,没有基类,也没有虚函数".尽管核心概念保持不变,但C#中此类类别的理论细节仍可供讨论.

由于聚合结构是严格的带有标记访问器的数据持有者,因此它们的不变性(在可能的C#环境中)将被保险.除非?指定了null运算符(),否则聚合也无法为空,无其他纯值类型.出于这个原因,许多非法的结构操作将成为可能,以及一些语法糖.


用途


  1. 聚合可以声明为const,因为它们的构造函数将被强制除了分配字段之外什么都不做.
  2. 聚合可以用作方法参数的默认值.
  3. 聚合可以是隐式顺序,促进与本机的交互
  4. 聚合将是不可变的,不会导致参考访问的数据丢失.编译器检测到这些子字段修改可能会导致完整的隐式重新分配.libraries.

假设语法


从C++语法中我们可以想象出以下几点:(记住,这是一个社区维基,欢迎并鼓励改进)

aggregate Size
{
    int Width;
    int Height;
}

aggregate Vector
{
    // Default values for constructor.
    double X = 0, Y = 0, Z = 0;
}

aggregate Color
{
    byte R, G, B, …
Run Code Online (Sandbox Code Playgroud)

c# struct aggregate class

8
推荐指数
1
解决办法
2387
查看次数

R reshape2中的cast()调用的自定义聚合函数出错

我想使用R将具有非唯一rownames的表中的数值数据汇总到具有唯一行名的结果表,其中值使用自定义函数进行汇总.摘要逻辑是:如果最大值与最小值的比率<1.5,则使用值的均值,否则使用中值.因为表非常大,我试图在reshape2包中使用melt()和cast()函数.

# example table with non-unique row-names
tab <- data.frame(gene=rep(letters[1:3], each=3), s1=runif(9), s2=runif(9))
# melt
tab.melt <- melt(tab, id=1)
# function to summarize with logic: mean if max/min < 1.5, else median
summarize <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))}
# cast with summarized values
dcast(tab.melt, gene~variable, summarize)

上面的最后一行代码会导致错误通知.

Error in vapply(indices, fun, .default) : 
  values must be type 'logical',
 but FUN(X[[1]]) result is type 'double'
In addition: Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf …

casting aggregate r reshape reshape2

8
推荐指数
2
解决办法
5614
查看次数

如何使用LINQ和lambdas对列表中对象的位标志枚举属性执行按位OR?

我有一个对象集合,每个对象都有一个位字段枚举属性.我想要得到的是整个集合中位字段属性的逻辑OR.如何通过循环遍历集合(希望使用LINQ和lambda)来完成此操作?

这是我的意思的一个例子:

[Flags]
enum Attributes{ empty = 0, attrA = 1, attrB = 2, attrC = 4, attrD = 8}

class Foo {
    Attributes MyAttributes { get; set; }
}

class Baz {
    List<Foo> MyFoos { get; set; }

    Attributes getAttributesOfMyFoos() {
        return // What goes here? 
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过这样用.Aggregate:

return MyFoos.Aggregate<Foo>((runningAttributes, nextAttributes) => 
    runningAttributes | nextAttribute);
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我无法弄清楚如何使用它来得到我想要的东西.有没有办法使用LINQ和一个简单的lambda表达式来计算这个,或者我只是在集合上使用循环?

注意:是的,这个示例案例很简单,基本foreach将是要走的路,因为它简单且不复杂,但这只是我实际使用的简化版本.

c# lambda enums aggregate bit-fields

8
推荐指数
1
解决办法
4559
查看次数

Django中DateTime字段之间的聚合差异

我有一个表,其中包含一系列与时间段相关的条目(具体来说,是为客户工作的时间):

task_time:
id     |    start_time    |    end_time       |    client (fk)
1        08/12/2011 14:48   08/12/2011 14:50     2
Run Code Online (Sandbox Code Playgroud)

我试图从我的Django应用程序聚合给定客户端的所有工作时间:

time_worked_aggregate = models.TaskTime.objects.\
                        filter(client = some_client_id).\
                        extra(select = {'elapsed': 'SUM(task_time.end_time - task_time.start_time)'}).\
                        values('elapsed')

if len(time_worked_aggregate) > 0:
    time_worked = time_worked_aggregate[0]['elapsed'].total_seconds()
else:
    time_worked = 0
Run Code Online (Sandbox Code Playgroud)

这似乎不优雅,但确实有效.或者至少我认为:事实证明它在PostgreSQL数据库上工作正常,但当我转移到SQLite时,一切都会消失.

一点挖掘表明,其原因是DateTimes不是SQLite中的一流数据.以下原始SQLite查询将完成我的工作:

SELECT SUM(strftime('%s', end_time) - strftime('%s', start_time)) FROM task_time WHERE ...;
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 上面的Python示例似乎很迂回.我们能更优雅地做到这一点吗?
  • 更重要的是,在这个阶段,我们能否以一种适用于Postgres和SQLite的方式实现?理想情况下,我不想编写原始SQL查询并切换恰好存在的数据库后端; 在一般的,Django是在保护我们从这个非常好.Django对此操作有合理的抽象吗?如果没有,对我来说在后端进行条件切换有什么明智的方法?

我应该提一下,数据集是数千个条目; 以下不太实际:

sum([task_time.end_date - task_time.start_date for task_time in models.TaskTime.objects.filter(...)])
Run Code Online (Sandbox Code Playgroud)

sqlite django postgresql orm aggregate

8
推荐指数
2
解决办法
4736
查看次数

嵌套聚合函数在postgresql中进行分组

我试图使用嵌套聚合函数和分组来获得平均值.我想要做的是:

SELECT AVG(SUM(x) GROUP BY y) WHERE ... GROUP BY ...;
Run Code Online (Sandbox Code Playgroud)

也就是说,对于返回的每一行,我希望其中一个字段是和的平均值,其中每个和是在y相同的行上.

如果可能的话,我想避免使用子选择.

sql postgresql grouping aggregate

8
推荐指数
1
解决办法
9977
查看次数

在给定时间间隔内的聚合函数

我的SQL有点生疏,我遇到这个问题有点困难.假设我有一个带有Timestamp列和Number列的表.目标是返回包含某个任意选择的常规间隔的平均值的结果集.

因此,例如,如果我有以下初始数据,则间隔为5分钟的结果输出如下:

time                               value
-------------------------------    -----
06-JUN-12 12.40.00.000000000 PM      2
06-JUN-12 12.41.35.000000000 PM      3
06-JUN-12 12.43.22.000000000 PM      4
06-JUN-12 12.47.55.000000000 PM      5
06-JUN-12 12.52.00.000000000 PM      2
06-JUN-12 12.54.59.000000000 PM      3
06-JUN-12 12.56.01.000000000 PM      4

OUTPUT:

start_time                         avg_value
-------------------------------    ---------
06-JUN-12 12.40.00.000000000 PM      3
06-JUN-12 12.45.00.000000000 PM      5
06-JUN-12 12.50.00.000000000 PM      2.5
06-JUN-12 12.55.00.000000000 PM      4
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个Oracle数据库,因此特定于Oracle的解决方案可以正常工作.当然,这可以通过存储过程完成,但我希望在单个查询中完成任务.

sql oracle aggregate oracle10g

8
推荐指数
2
解决办法
7900
查看次数

Angular UI Grid - 如何自定义聚合行行为

分组时,ng-grid会创建与常规行不同的组行.特别是,组行不显示常规列,但显示由aggregateTemplate定义的单个合并行.我正在尝试做的是自定义组行以包括聚合列数据.例如:

列:
NAME | VALUE

数据:
name1 | 5
name1 | 5
name2 | 1

按NAME分组时显示的网格:
- name1 | 10(这是扩展的第一组行)
- name1 | 5(这些是实际的数据行)
- name1 | 5(这些是实际的数据行)
- name2 | 1(这是折叠的第二组行)

请注意,组行显示两列,其VALUE等于其子项的总和.
如果您熟悉ms excel数据透视表,那就是我正在尝试模拟的分组类型功能.

关于堆栈溢出的类似问题(如何使用ng-grid中的分组设置聚合)显示了如何进行子聚合计算的示例,但我仍然坚持如何让ng-grid像常规行一样显示输出有单独的列.看看ng-grid代码,它看起来不是一件容易的事.有人有这方面的经验吗?
谢谢!

aggregate angularjs ng-grid

8
推荐指数
1
解决办法
1万
查看次数

为什么在Spark中聚合和折叠两个不同的API?

使用Scala标准库时,我可以做这样的事情:

scala> val scalaList = List(1,2,3)
scalaList: List[Int] = List(1, 2, 3)

scala> scalaList.foldLeft(0)((acc,n)=>acc+n)
res0: Int = 6
Run Code Online (Sandbox Code Playgroud)

从许多Int中取出一个Int.

我可以这样做:

scala> scalaList.foldLeft("")((acc,n)=>acc+n.toString)
res1: String = 123
Run Code Online (Sandbox Code Playgroud)

从许多Int中制作一个String.

因此,foldLeft可以是同构的,也可以是异构的,无论我们想要什么,它都在一个API中.

在Spark中,如果我想要很多Int中的一个Int,我可以这样做:

scala> val rdd = sc.parallelize(List(1,2,3))
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:12
scala> rdd.fold(0)((acc,n)=>acc+n)
res1: Int = 6
Run Code Online (Sandbox Code Playgroud)

fold API类似于foldLeft,但它只是同类的,RDD [Int]只能生成带折叠的Int.

Spark中也有一个聚合API:

scala> rdd.aggregate("")((acc,n)=>acc+n.toString, (s1,s2)=>s1+s2)
res11: String = 132
Run Code Online (Sandbox Code Playgroud)

它是异构的,RDD [Int]现在可以生成一个String.

那么,为什么fold和聚合在Spark中实现为两个不同的API?

为什么它们的设计不像foldLeft那样可以是同构的还是异构的?

(我对Spark很新,请原谅我这是一个愚蠢的问题.)

scala aggregate heterogeneous homogenous-transformation apache-spark

8
推荐指数
1
解决办法
4489
查看次数

没有parallel_enabled的ODCIAggregateMerge

这些是Oracle docs的引文:

[可选]通过合并两个聚合上下文合并并返回单个上下文。此操作组合子集上的聚合结果,以获得整个集合上的聚合。在对集合进行串行或并行评估时,可能需要执行此额外步骤。如果需要,它在步骤4之前执行:

在此类汇总操作中,将调用ODCIAggregateMerge()接口来计算超级聚合值。

我们有一个聚合函数,我们不想并行运行。
原因是上下文的合并将消耗资源,并且将迫使我们使用与现在使用的数据结构不同的数据结构,从而有效地抵消了并行执行带来的任何性能优势。

因此,我们没有函数声明为parallel_enabled,而是以防万一的方式返回ODCIAggregateMerge中的ODCIconst.Error。

但是,第一个引用文档声称,即使在串行评估中也可能发生合并。
超级聚合(汇总,多维数据集)是明显的示例,但是还有其他示例吗?

我完全无法通过简单的分组依据来重现它,如果没有parallel_enabled,就永远不会调用merge,并且似乎在该分组中始终只创建一个上下文。

是否可以安全地假设没有parallel_enabled设置,合并将永远不会运行?
您见过该规则的反例吗?

sql oracle plsql aggregate

8
推荐指数
1
解决办法
145
查看次数