我的文档有一个多值字段"sharedTo",其中包含文档共享的组.现在,我想查找至少与给定组列表中的一个共享的所有文档.例如,我想查找与组"foo"或组"bar"或两者共享的所有文档.目前我正在构建这样的查询:
sharedTo:"foo" OR sharedTo:"bar"
Run Code Online (Sandbox Code Playgroud)
对于每个组,我只需添加一个新的OR查询部分.这是有效的,但是我想知道是否有更有效的方法来做这个
sharedTo IN ('foo', 'bar')
Run Code Online (Sandbox Code Playgroud) 我最近偶然发现了一段像这样的代码:
Object o = .. ;
Foo foo = Foo.class.cast(o);
Run Code Online (Sandbox Code Playgroud)
我实际上甚至不知道java.lang.Class有一个强制转换方法,所以我查看了文档,从我收集的内容中,这只是对类对象所代表的类进行强制转换.所以上面的代码大致相当于
Object o = ..;
Foo foo = (Foo)o;
Run Code Online (Sandbox Code Playgroud)
所以我想知道,为什么我会想要使用强制转换方法而不是简单地进行"旧方法".有没有一个很好的例子,使用cast方法比简单的转换更有益?
在Apache Flink中,我有一组元组.让我们假设一个非常简单Tuple1<String>.元组可以在其值字段中具有任意值(例如,"P1","P2"等).可能值的集合是有限的,但我事先并不知道全集(所以可能有'P362').我想根据元组内部的值将该元组写入某个输出位置.所以我希望有以下文件结构:
/output/P1/output/P2在文档中我只发现了写入我事先知道的位置的可能性(例如stream.writeCsv("/output/somewhere")),但没有办法让数据的内容决定数据实际结束的位置.
我在文档中读到了关于输出拆分的内容,但这似乎没有提供一种方法将输出重定向到我希望拥有它的方式(或者我只是不明白这是如何工作的).
可以使用Flink API完成,如果是这样,怎么做?如果没有,是否可能有第三方图书馆可以做到这一点,还是我必须自己构建这样的东西?
更新
根据Matthias的建议,我想出了一个筛选接收函数,它确定输出路径,然后在序列化之后将元组写入相应的文件.我把它放在这里作为参考,也许对其他人有用:
public class SiftingSinkFunction<IT> extends RichSinkFunction<IT> {
private final OutputSelector<IT> outputSelector;
private final MapFunction<IT, String> serializationFunction;
private final String basePath;
Map<String, TextOutputFormat<String>> formats = new HashMap<>();
/**
* @param outputSelector the selector which determines into which output(s) a record is written.
* @param serializationFunction a function which serializes the record to a string.
* @param basePath the base path for writing the records. It will be appended …Run Code Online (Sandbox Code Playgroud) 我想用mock模拟一些流畅的界面,这基本上是一个邮件生成器:
this.builder()
.from(from)
.to(to)
.cc(cc)
.bcc(bcc)
.template(templateId, templateParameter)
.send();
Run Code Online (Sandbox Code Playgroud)
使用Spock进行模拟时,需要进行大量的设置:
def builder = Mock(Builder)
builder.from(_) >> builder
builder.to(_) >> builder
Run Code Online (Sandbox Code Playgroud)
当你想根据用例测试与模拟的某些交互时,它变得更加麻烦.所以我在这里基本上有两个问题:
有没有办法用较少的代码指定一个流畅的接口的模拟,例如:
def builder = Mock(Builder)builder./(from|to|cc|bcc |template)/(*) >> builder
或类似于Mockito的Deep Stubs的东西(参见http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#RETURNS_DEEP_STUBS)
我们将Spock测试与Spring的@ContextConfiguration结合起来,这样我们就可以在spring上下文中构建bean,然后使用Spock进行实际测试.我们想把spock mocks注入我们的春豆.对于Mockito,有一个扩展,允许您执行以下操作:
<mockito:mock id="accountService" class="org.kubek2k.account.DefaultAccountService" />
Run Code Online (Sandbox Code Playgroud)
然后将这个模拟引用到其他spring bean.Spock似乎没有这样的扩展.如果您知道如何在Specification类之外创建Mocks,那么再次构建它可能不会太费力.创建我所知道的Spock模拟的唯一方法是:
T Mock(Class<T> type)
Run Code Online (Sandbox Code Playgroud)
在规范中.Spock中是否有一些API可以在不在Specification类中时创建Mocks,所以我可以为Spring上下文创建Spock模拟?
hibernate的@BatchSize注释允许批量提取延迟加载的实体.例如,如果我有类似的东西:
public class Product {
@OneToMany(fetchType=LAZY)
@BatchSize(size=10)
private ProductCategory category;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我得到产品的类别,Hibernate将获取最多十个产品的类别,这些产品在当前会话中并且尚未初始化其类别字段.这样可以节省大量SQL调用数据库.到现在为止还挺好.现在我想知道为什么我不会在每个懒惰的加载关系上使用@BatchSize注释?毕竟为什么我想要额外调用数据库?显然必须有这样的原因,否则Hibernate的人可能会把它作为默认,但我目前看不到它.
spring webflow文档提到他们向流添加消息的方法是在流中的文件messages.properties中定义关于该流的所有消息:
国际化消息在Spring MessageSource访问的消息包中定义.要创建特定于流的消息包,只需在流的目录中定义messages.properties文件即可.为您需要支持的每个其他区域设置创建默认的messages.properties文件和.properties文件.
在我们的webapp中,我们使用Spring Webflow和专有框架.我们将所有国际化消息都放在一个文件中,我们希望Spring Webflow可以访问这个消息,而不是使用几十个属性文件乱丢我们的项目.有没有办法为spring webflow配置消息源,还是我们坚持使用messages.properties?
在我们的实体bean中,我们使用自定义ID格式,其中包含校验和以验证ID实际上是否有效.Ids看起来像ID827391738979.为了确保所有代码只使用正确的ID,我们在ID String周围创建了一个代码包装器:
class ID {
public ID(String id) {
// parse and verify ID
}
public String toString() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
所有代码都使用此ID对象.但是在我们的实体中,我们将ID定义为String:
class SomeEntity {
@Column
private String itsID;
}
Run Code Online (Sandbox Code Playgroud)
现在我们想使用Spring-Data-JPA通过它的id查询一些对象.所以我们这样做:
public SomeEntity findByItsID(ID itsId);
Run Code Online (Sandbox Code Playgroud)
问题是,现在Spring Data JPA尝试将ID类型参数分配给查询,而查询当然需要a String.
是否可以让Spring Data JPA在将参数插入查询之前将参数转换为期望的类型(例如通过注册Spring转换器)?或者,我们是否必须让方法采用这样的字符串:
public SomeEntity findByItsId(String itsId);
Run Code Online (Sandbox Code Playgroud)
我宁愿避免这种情况,因此所有代码都可以使用ID该类而不是使用字符串.
我正在重组Play!项目中HTML模板文件中有很多JS代码.此代码应移至外部JS文件,以提高可读性和加快页面加载速度.但是,当我在公共文件夹中创建一个JS文件时,所有@ {Controller.method}链接替换都不再起作用.我正在考虑从HTML模板调用一些初始化函数,它只提供所需的URL
initialize({ "Application.doThis" : "@{Application.doThis}"})
Run Code Online (Sandbox Code Playgroud)
但是,添加任何URL都会变得非常麻烦且容易出错.另一件事是,I18N也不再适用.那么这些场景的最佳实践是什么,你将JS代码放在一个单独的文件中,但仍想在你的JS中使用URL生成和I18N?
我正在使用Solrs TermsComponent来实现自动完成功能.我的文档包含我在"标签"字段中编入索引的标签.现在,我可以使用TermsComponent找出所有存储文档中使用的标记.到目前为止,这非常有效.
但是还有一些额外的要求:每个文档都有一个所有者字段,其中包含拥有它的用户的ID.自动填充列表应仅包含文档中的标记,请求自动填充的用户实际拥有该标记.
我试图设置查询参数,但这似乎被TermsComponent忽略:
public static List<String> findUniqueTags(String beginningWith, User owner) throws IOException {
SolrParams q = new SolrQuery().setQueryType("/terms")
.setQuery("owner:" + owner.id.toString())
.set(TermsParams.TERMS, true).set(TermsParams.TERMS_FIELD, "tags")
.set(TermsParams.TERMS_LOWER, beginningWith)
.set(TermsParams.TERMS_LOWER_INCLUSIVE, false)
.set(TermsParams.TERMS_PREFIX_STR, beginningWith);
QueryResponse queryResponse;
try {
queryResponse = getSolrServer().query(q);
} catch (SolrServerException e) {
Logger.error(e, "Error when querying server.");
throw new IOException(e);
}
NamedList tags = (NamedList) ((NamedList)queryResponse.getResponse().get("terms")).get("tags");
List<String> result = new ArrayList<String>();
for (Iterator iterator = tags.iterator(); iterator.hasNext();) {
Map.Entry tag = (Map.Entry) iterator.next();
result.add(tag.getKey().toString());
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
那么有没有办法限制由TermsComponent返回的标签,还是我手动查询用户的所有标签并自己过滤?
java ×4
spring ×3
solr ×2
spock ×2
unit-testing ×2
apache-flink ×1
autocomplete ×1
bigdata ×1
external ×1
frameworks ×1
generics ×1
groovy ×1
hibernate ×1
javascript ×1
jpa ×1
performance ×1
solrj ×1
spring-data ×1
syntax ×1