blob: 98abe4eb9e9ee2dca7953f1aa6d4c7acb5b5bc61 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.cache.lucene;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexableField;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.cache.lucene.internal.repository.serializer.SerializerTestHelper;
import org.apache.geode.pdx.PdxInstance;
import org.apache.geode.pdx.internal.PdxInstanceFactoryImpl;
import org.apache.geode.test.junit.categories.LuceneTest;
@Category({LuceneTest.class})
public class FlatFormatPdxSerializerJunitTest {
private PdxInstance createPdxInstance() {
HashSet positions = new HashSet();
PdxInstanceFactoryImpl outForPosition1 = (PdxInstanceFactoryImpl) PdxInstanceFactoryImpl
.newCreator("dummy.PositionPdx", false, localCacheRule.getCache());
outForPosition1.writeString("country", "USA");
outForPosition1.writeString("secId", "DELL");
outForPosition1.writeDouble("sharesOutstanding", 3000);
outForPosition1.writeInt("pid", 13);
outForPosition1.writeInt("portfolioId", 3);
// Identity Field.
outForPosition1.markIdentityField("secId");
PdxInstance position1_pdx = outForPosition1.create();
PdxInstanceFactoryImpl outForPositions1 = (PdxInstanceFactoryImpl) PdxInstanceFactoryImpl
.newCreator("dummy.PositionPdx", false, localCacheRule.getCache());
outForPositions1.writeString("country", "USA");
outForPositions1.writeString("secId", "AAPL");
outForPositions1.writeDouble("sharesOutstanding", 5000);
outForPositions1.writeInt("pid", 15);
outForPositions1.writeInt("portfolioId", 3);
// Identity Field.
outForPositions1.markIdentityField("secId");
PdxInstance positions1_pdx = outForPositions1.create();
PdxInstanceFactoryImpl outForPositions2 = (PdxInstanceFactoryImpl) PdxInstanceFactoryImpl
.newCreator("dummy.PositionPdx", false, localCacheRule.getCache());
outForPositions2.writeString("country", "USA");
outForPositions2.writeString("secId", "IBM");
outForPositions2.writeDouble("sharesOutstanding", 4000);
outForPositions2.writeInt("pid", 14);
outForPositions2.writeInt("portfolioId", 3);
// Identity Field.
outForPositions2.markIdentityField("secId");
PdxInstance positions2_pdx = outForPositions2.create();
positions.add(positions1_pdx);
positions.add(positions2_pdx);
PdxInstanceFactoryImpl out = (PdxInstanceFactoryImpl) PdxInstanceFactoryImpl
.newCreator("dummy.PortfolioPdx", false, localCacheRule.getCache());
out.writeInt("ID", 3);
out.writeObject("position1", position1_pdx);
out.writeObject("positions", positions);
out.writeString("status", "active");
out.writeStringArray("names", new String[] {"aaa", "bbb", "ccc", "ddd"});
out.writeString("description", "John Denver");
out.writeLong("createTime", 0);
out.writeIntArray("intArr", new int[] {2001, 2017});
// Identity Field.
out.markIdentityField("ID");
PdxInstance pdx = out.create();
return pdx;
}
@Rule
public LocalCacheRule localCacheRule = new LocalCacheRule();
@Test
public void shouldParseTopLevelPdxIntArray() {
String[] fields = new String[] {"description", "status", "names", "intArr", "position1.country",
"position1.sharesOutstanding", "position1.secId", "positions.country",
"positions.sharesOutstanding", "positions.secId"};
FlatFormatSerializer serializer = new FlatFormatSerializer();
PdxInstance pdx = createPdxInstance();
Document doc1 = SerializerTestHelper.invokeSerializer(serializer, pdx, fields);
assertEquals(17, doc1.getFields().size());
IndexableField[] fieldsInDoc = doc1.getFields("intArr");
Collection<Object> results = getResultCollection(fieldsInDoc, true);
assertEquals(2, results.size());
assertTrue(results.contains(2001));
assertTrue(results.contains(2017));
}
@Test
public void shouldParseTopLevelPdxStringField() {
String[] fields = new String[] {"status"};
FlatFormatSerializer serializer = new FlatFormatSerializer();
PdxInstance pdx = createPdxInstance();
Document doc1 = SerializerTestHelper.invokeSerializer(serializer, pdx, fields);
IndexableField[] fieldsInDoc = doc1.getFields("status");
Collection<Object> results = getResultCollection(fieldsInDoc, false);
assertEquals(1, results.size());
assertTrue(results.contains("active"));
}
@Test
public void shouldParseSecondTopLevelPdxStringField() {
String[] fields = new String[] {"positions.secId"};
FlatFormatSerializer serializer = new FlatFormatSerializer();
PdxInstance pdx = createPdxInstance();
Document doc1 = SerializerTestHelper.invokeSerializer(serializer, pdx, fields);
IndexableField[] fieldsInDoc = doc1.getFields("positions.secId");
Collection<Object> results = getResultCollection(fieldsInDoc, false);
assertEquals(2, results.size());
assertTrue(results.contains("IBM"));
assertTrue(results.contains("AAPL"));
}
@Test
public void shouldParseSecondTopLevelPdxDoubleField() {
String[] fields = new String[] {"positions.sharesOutstanding"};
FlatFormatSerializer serializer = new FlatFormatSerializer();
PdxInstance pdx = createPdxInstance();
Document doc1 = SerializerTestHelper.invokeSerializer(serializer, pdx, fields);
IndexableField[] fieldsInDoc = doc1.getFields("positions.sharesOutstanding");
Collection<Object> results = getResultCollection(fieldsInDoc, true);
assertEquals(2, results.size());
assertTrue(results.contains(5000.0));
assertTrue(results.contains(4000.0));
}
private Collection<Object> getResultCollection(IndexableField[] fieldsInDoc, boolean isNumeric) {
Collection<Object> results = new LinkedHashSet();
for (IndexableField field : fieldsInDoc) {
if (isNumeric) {
results.add((Object) field.numericValue());
} else {
results.add(field.stringValue());
}
}
return results;
}
}