古巴平台上的通用过滤器–类固醇上的excel过滤器

正如我上次承诺的那样,我计划浏览该平台的某些功能,这些功能我认为非常有价值。 所以我将在这里做一些系列。 从明显的用户界面,过滤,安全性到一些高级功能(如Web Portal,可扩展性,审核,动态属性等)开始。

CUBA功能#1 –通用过滤器

我想在这篇博客文章中介绍通用过滤器解决方案。 但是在弄清技术细节之前,让我们开始研究此功能解决的基本用例。

用户如何获得实际需要的数据

我们将继续使用上次的示例:

具有客户-订单关系的域示例

具有客户-订单关系的域示例

基于此实体模型,让我们考虑用户可能具有的一些可能的过滤器要求。

首先,在实体本身及其直接属性上有某些过滤器:

  • 显示纽约的所有客户
  • 显示2015年的所有订单
  • 显示价格最低的所有产品。 350 $
  • 显示处于“已完成”状态的所有订单

接下来,我们基于1:1 / N:1关联进行过滤:

  • 列出客户“ Mario David”的所有订单
  • 列出居住在达拉斯的所有客户(通过地址实体)
  • 显示“笔记本”类别中的所有产品

然后,我们有了基于1:N / M:N关系的过滤器:

  • 列出2015年至少有一个订单的所有客户
  • 列出最多包含五个订单项的所有订单
  • 列出所有订单项的价格总和大于200 $的订单

基本上,这是过滤器要求的类别,可以满足大约80%的用例。

解决这类问题的程序化方式

我通常处理此类要求的方式如下:首先,我将开始着手研究用户实际希望通过此过滤实现的目标。 通常,它仅用于减少当前执行的工作流的实体实例数量。 例如,“仅针对未及时付款的订单进行过滤” –在这种情况下,工作流程将类似于“发送过期通知”。 使用过滤的另一种方法是,如果结果是报告的基础(本博客文章中未介绍)。

无论是什么原因,当我知道过滤条件是什么时,对我来说,作为程序员的一个简单解决方案就是立即实施过滤条件。 如果我们考虑在Grails中实现,那么我会在后端想到这样的东西:

class OrderController {//...Date now = new Date()respond Order.where { dueDate > now }.list(params)//...
}

这将以简化的方式完成这项工作。 在前端,可以使用下拉框或切换按钮。 另一种可能性是通过链接获取该数据,从而将信息保留在其中。

无论采用哪种实现方式–整个解决方案的重点是,作为开发人员,我必须事先了解此过滤器要求,因为必须以编程方式进行实施。

这些问题的通用解决方案

除了按需直接实施过滤器解决方案外,一种更通用的解决方案也很普遍。 在这种情况下,开发人员不预先知道过滤器要求,而是让用户决定要搜索/过滤的内容。 为此,必须从属性的基础数据类型推断出可能的过滤条件。

可以将此模型视为类似于excel 过滤机制。 excel根据当前列的数据类型,提供在这种情况下有意义的过滤器可能性。 可以将日期过滤到一定范围内,数字必须大于给定数字,字符串可以包含某个子字符串,依此类推。 由于Excel并不真正了解实体和关系,因此无法搜索/过滤关联。 因此,此过滤器机制仅在一定程度上有价值。

CUBA带来了什么

因此,CUBA来到这里,告诉我们,其中有一个“通用过滤器”,它使我们可以过滤大多数我们想要的子数据。 让我们更深入地了解它。

产品的CUBA中的通用过滤器示例

产品的CUBA中的通用过滤器示例

我创建了一个演示应用程序 ,该应用程序是上述域模型的实现。 在这里,我们看到了我们商店中可用的产品列表。 在数据表的顶部,您会注意到过滤器部分,可用于定义该表的过滤器。 链接“添加搜索条件”将查看基础实体(在本例中为Product)并显示所有实体。 实际上,不仅显示了实体的直接属性,而且还显示了相关实体及其属性(以及相关实体及其属性以及……)。

选择一些可用属性后,表中的过滤器部分将填充相应的条件框。 根据属性类型,定义条件的可能性会有所不同。

这是过滤条件的这种组合的一个示例:

从类别智能手机中选择所有以Apple开头的产品,自2015年2月11日起更改

从类别智能手机中选择所有以Apple开头的产品,自2015年2月11日起更改

根据属性类型,过滤条件可以处于不同的模式。 文本属性可能以给定文本开头包含给定文本,依此类推。 可以使用相应的日期过滤器来过滤日期,例如给定日期之前之后 。 枚举以及“多对一”关联可以通过下拉列表选择。 这种类型的条件模式是setlist=等。我可以继续描述不同的数据类型及其过滤器模式,但现在我将其保留。 如果您想了解所有可能性,请在此处找到一个不错的文档。

我现在展示的内容几乎只是CUBA为用户和开发人员提供有关过滤的可能性的表面。 但是,在考虑时,它具有相当多的功能,可以使用户自行进行过滤。

如您所见,乍看之下,几乎没有什么阻止我(作为开发人员)让用户决定所需的过滤器可能性,而不必手动实现不同的可能性。

要完成这项工作,我需要做什么?

好的,所以有趣的问题可能是,作为开发人员实施此功能需要付出多少努力。 要查看此内容,您必须查看产品列表的UI定义文件 。 基本上它是这样的:

<filter id="filter" datasource="productsDs"><properties include=".*"/>
</filter>

就是这样 。 其实不是,因为你必须做定义productsDs数据源定义,你会在找到XML描述为好。

更精确地说,您通常不会自己编写定义。 相反,您将使用CUBA Studio进行管道。

CUBA Studio显示带有可能性的产品实体以生成屏幕

CUBA Studio显示带有可能性的产品实体以生成屏幕

在这种情况下,您将启动本地Studio安装(并从示例项目中进行git clone),打开该项目,查看您的产品实体(如上所述),并告诉它为其生成标准视图。 在回答了有关此生成步骤的不同选项的几个问题之后,它将为该实体的列表视图提供确切的XML描述符文件,包括过滤器的可能性。

真正的重物是什么?

看到这一点之后,我想到了两件事。 首先,这只是用于特定的过滤方案。 如何预定义此过滤器,以使我的用户不必一遍又一遍地自行挑选它们? 第二件事是,通常存在过滤要求,这些要求超出了所描述的可能性。 CUBA如何解决?

该平台提供了针对这些异议的解决方案。 在本系列的下一部分中,我将对此进行介绍。

翻译自: https://www.javacodegeeks.com/2015/12/the-generic-filter-in-cuba-platform-excel-filters-on-steroids.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基准测试:Java 8 Lambda和流如何使您的代码慢5倍

与长期的实现相比&#xff0c;Java 8 lambda和流的性能如何&#xff1f; Lambda表达式和流在Java 8中受到了热烈的欢迎。这些是迄今为止很激动人心的功能&#xff0c;很长一段时间以来&#xff0c;它们就已经应用到Java中了。 新的语言功能使我们可以在代码中采用更具功能性的…

ssm框架逻辑删除mysql_MybatisPlus--CRUD接口及主键增长策略、自动填充、乐观锁更新数据...

目录一、insert1、插入操作2、主键策略二、update1、根据Id更新操作2、自动填充3、乐观锁三、select1、根据id查询记录2、通过多个id批量查询3、简单的条件查询4、分页四、delete1、根据id删除记录2、批量删除3、简单的条件查询删除4、逻辑删除一、insert1、插入操作RunWith(Sp…

python对英语的要求_学python需要英语基础吗

在很多人的眼里&#xff0c;学习编程需要英语基础&#xff0c;因为程序代码全是英文字母&#xff0c;如果没有英语基础可能很难学懂编程。程序代码是英文确实没有错&#xff0c;但是也不是必须得懂英语&#xff0c;因为计算机程序有自己语言&#xff0c;并不是我们生活中的英语…

python找不到csv文件_Python如何读取csv文件

逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。纯文本意味着该文件是一个字符序列&…

python cv2模块imshow_Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()

一、需要工具本机使用python 2.7.10下调试代码均通过&#xff0c;一下学习需要有一定的代码阅读能力&#xff0c;一下学习只介绍函数方法&#xff1a;Python 作为一种高效简洁的直译式语言非常适合我们用来解决日常工作的问题。而且它简单易学&#xff0c;初学者几个小时就可以…

2016年将是Java终于拥有窗口函数的那一年!

你没听错。 到目前为止&#xff0c;出色的窗口功能是SQL独有的功能。 即使是复杂的函数式编程语言似乎也缺少这种漂亮的功能&#xff08;如果我记错了&#xff0c;请纠正我&#xff0c;Haskell伙计们&#xff09;。 我们撰写了许多有关窗口函数的博客文章&#xff0c;并在诸如…

android 仿京东地址选择_Android 开发:仿美团地址选择

最近做了这个功能&#xff0c;分享一下&#xff0c;用的是百度地图api&#xff0c;和美团外卖的地址选择界面差不多&#xff0c;也就是可以搜索或者滑动地图展示地址列表给用户选择&#xff0c;看下效果图先。文章重点展示地图并定位到“我”的位置 滑动地图获取周边poi(逆地理…

ps还原上一步快捷键_ps还原上一步快捷键_photoshop恢复上一步操作的快捷键是什么...

满意答案simonsinxer推荐于 2017.09.01采纳率&#xff1a;53% 等级&#xff1a;11已帮助&#xff1a;63469人还原/重做前一步操作 【Ctrl】【Z】其他一些快捷键&#xff1a;还原两步以上操作 【Ctrl】【Alt】【Z】重做两步以上操作 【Ctrl】【Shift】【Z】剪切选取的图像或路…

python中排序从小到大_从Python看排序:冒泡排序

冒泡排序在排序算法中是最简单的一种&#xff0c;它通过多次遍历列表&#xff0c;将最大的元素冒泡到列表的头部或尾部。我们通过对四张扑克牌&#xff08;花色相同&#xff09;以从小到大的方式进行排序来演示该算法的工作原理。首先将扑克牌面朝上放在桌上&#xff0c;如下图…

c语言三个数从小到大排序/输出_我的c语言笔记(三)

int表达式这个表达式存在的目的在于将表达式转为整数。比如&#xff1a;float a9999.9999&#xff1b;int b;b(int)(a/1000);就可以得到9啦&#xff0c;别忘了套上固定格式哦&#xff5e;然后我们接下来一起来做一道很重要的题哦&#xff0c;反复练习&#xff0c;可以顺利拿下同…

java虚拟_Java虚拟机(JVM)工作原理

虽然本教程的内容为 x86 处理器的原生汇编语言&#xff0c;但是了解其他机器架构如何工作也是有益的。JVM 是基于堆栈机器的首选示例。JVM 用堆栈实现数据传送、算术运算、比较和分支操作&#xff0c;而不是用寄存器来保存操作数(如同 x86 一样)。数据结构&#xff0c;让它们协…

java string blob_java String类型转换为Blob类型

展开全部这个是mysql下存取blob字段的一个很简单的类&#xff0c;跟据自己的需要32313133353236313431303231363533e4b893e5b19e31333332623936改改就行了/*** Title: BlobPros.java* Project: test* Description: 把图片存入mysql中的blob字段&#xff0c;并取出* Call Module…

Neo4j:特定关系与一般关系+属性

为了在Neo4j查询中获得最佳的遍历速度&#xff0c;我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件之间的“ RSVP”关系建模。 一个人可以对事件表示“是”或“否”&#…

java 按位置格式化字符串_Java字符串格式化,{}占位符根据名字替换实例

我就废话不多说了&#xff0c;大家还是直接看代码吧~import java.beans.PropertyDescriptor;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;public class StringFormatUtil …

Apache Drill 1.4性能增强的简要概述

今天&#xff0c;我们很高兴宣布Apache Drill 1.4现已在MapR发行版中可用。 钻1.4是MAPR生产就绪和支持的版本&#xff0c;可以从下载这里 &#xff0c;找到1.4版本说明这里 。 Drill 1.4以其高度灵活和可扩展的体系结构为基础&#xff0c;带来了多种新功能以及对查询性能的增…

【01背包】洛谷P1282多米诺骨牌

题目描述 多米诺骨牌有上下2个方块组成&#xff0c;每个方块中有1~6个点。现有排成行的 上方块中点数之和记为S1&#xff0c;下方块中点数之和记为S2&#xff0c;它们的差为|S1-S2|。例如在图8-1中&#xff0c;S161119&#xff0c;S2153211&#xff0c;|S1-S2|2。每个多米诺骨牌…

java geolitecity_GeoLite2 Java根据IP获得城市、经纬度

之前我们介绍过通过 qqwry.dat 根据IP获得所属城市和运营商信息。但是这个 qqwry.dat 已经太久没更新了&#xff0c;数据有些不准确&#xff0c;而且现在我们有个需求就是想获取某个IP所在的经纬度。这里我们可以使用 GeoLite2&#xff0c;这个是国外开源的一个库&#xff0c;需…

计算机专业英语第二版张强华翻译_计算机语言发展的三个阶段,机器语言、汇编语言与高级语言...

在如今信息发达的时代&#xff0c;科技日新月异&#xff0c;计算机和Internet网络的发展也成为人们日常生活的重要部分。学习一两门计算机编程语言也如当初学习英文一样的火热&#xff0c;随着人工智能AI和云计算的不断发展&#xff0c;Python语言和Scala语言已经成为这两个领域…

使用Apache Drill REST API通过Node构建ASCII仪表板

Apache Drill有一个隐藏的瑰宝&#xff1a;易于使用的REST接口。 该API可用于查询&#xff0c;分析和配置Drill引擎。 在此博客文章中&#xff0c;我将说明如何使用Brilled Contrib使用Drill REST API创建ascii仪表板。 ASCII仪表盘如下所示&#xff1a; 先决条件 Node.js …

影子场vs.属性访问器接口第2轮

如果你们还没有注意到Dirk Lemmerman和我之间的&#xff08;轻松&#xff09; 对决 &#xff0c;那么让我快速提及一下我们是如何做到这一点的。 首先&#xff0c;Dirk创建了JavaFX技巧23&#xff1a;“ 为属性保存内存阴影字段 ”&#xff0c;以帮助应用程序开发人员在使用Jav…