/* * Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com) * * Licensed 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 com.orientechnologies.orient.test.database.auto; import com.orientechnologies.orient.core.record.impl.ODocument; import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; import org.testng.Assert; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; @Test(groups = { "index" }) public class FullTextIndexTest extends DocumentDBBaseTest { private static final int TOT = 1000; private static final String TEXT = "Jay Glenn Miner (May 31, 1932 to June 20, 1994), was a famous integrated circuit designer, known primarily for his " + "work in multimedia chips and as the 'father of the Amiga'[1]. He received a BS in EECS from " + "UC Berkeley in 1959. Miner started in the electronics industry with a number of designs in the " + "medical world, including a remote-control pacemaker. He moved to Atari in the late 1970s. One of " + "his first successes was to combine an entire breadboard of components into a single chip, known " + "as the TIA. The TIA was the display hardware for the Atari 2600, which would go on to sell millions." + " After working on the TIA he headed up the design of the follow-on chip set that would go on to" + " be the basis of the Atari 8-bit family of home computers, known as ANTIC and CTIA. " + "In the early 1980s Jay, along with other Atari staffers, had become fed up with management and " + "decamped. They set up another chipset project under a new company in Santa Clara, called " + "Hi-Toro (later renamed to Amiga Corporation), where they could have some creative freedom. " + "There, they started to create a new Motorola 68000-based games console, codenamed Lorraine, " + "that could be upgraded to a computer. To raise money for the Lorraine project, Amiga Corp." + " designed and sold joysticks and game cartridges for popular game consoles such as the" + " Atari 2600 and ColecoVision, as well as an odd input device called the Joyboard, essentially " + "a joystick the player stood on. Atari continued to be interested in the team's efforts throughout" + " this period, and funded them with $500,000 in capital in return for first use of their resulting" + " chipset. The Amiga crew, having continuing serious financial problems, had sought more monetary" + " support from investors that entire Spring. Amiga entered in to discussions with Commodore." + " The discussions ultimately led to Commodore wanting to purchase Amiga outright, which would" + " (from Commodore's viewpoint) cancel any outstanding contracts - including Atari Inc.'s." + " So instead of Amiga delivering the chipset, Commodore delivered a check of $500,000 to Atari" + " on Amiga's behalf, in effect returning the funds invested into Amiga for completion of the" + " Lorraine chipset. The original Amiga (1985) Jay worked at Commodore-Amiga for several years," + " in Los Gatos (CA). They made good progress at the beginning, but as Commodore management" + " changed, they became marginalised and the original Amiga staff was fired or left out on a" + " one-by-one basis, until the entire Los Gatos office was closed. Miner later worked as a" + " consultant for Commodore until it went bankrupt. He was known as the 'Padre' (father) of" + " the Amiga among Amiga users. Jay always took his dog 'Mitchy' (a cockapoo) with him wherever" + " he went. While he worked at Atari, Mitchy even had her own ID-badge, and Mitchy's paw print" + " is visible on the inside of the Amiga 1000 top cover, alongside the signatures of the" + " engineers who worked on it. Jay endured kidney problems for most of his life, according" + " to his wife, and relied on dialysis. His sister donated one of her own. Miner died due" + " to complications from kidney failure at the age of 62, just two months after Commodore" + " declared bankruptcy."; private String[] words; @Parameters(value = "url") public FullTextIndexTest(@Optional String url) { super(url); words = TEXT.split(" "); } @Test public void testFullTextInsertion() { createBasicTestSchema(); ODocument doc = new ODocument(); StringBuilder text = new StringBuilder(); Random random = new Random(1000); for (int i = 0; i < TOT; ++i) { doc.reset(); doc.setClassName("Whiz"); doc.field("id", i); doc.field("date", new Date()); text.setLength(0); for (int w = 0; w < 10; ++w) { if (w > 0) text.append(' '); text.append(words[random.nextInt(words.length - 1)]); } doc.field("text", text.toString()); doc.save(); } // System.out.println("Indexed words: " // + database.getMetadata().getSchema().getClass("Whiz").getProperty("text").getIndex().getSize()); } @Test(dependsOnMethods = "testFullTextInsertion") public void testFullTextSearch() { Set<ODocument> allDocs = new HashSet<ODocument>(); for (int i = 0; i < words.length - 1; ++i) { List<ODocument> docs = database.query(new OSQLSynchQuery<Object>("SELECT FROM Whiz WHERE text containstext \"" + words[i] + "\"")); allDocs.addAll(docs); } Assert.assertEquals(allDocs.size(), TOT); } @Test(dependsOnMethods = "testFullTextInsertion") public void testDeleteDocument() { StringBuilder text = new StringBuilder(); Random random = new Random(1000); ODocument doc = new ODocument(); doc.setClassName("Whiz"); doc.field("id", 2000); doc.field("date", new Date()); for (int w = 0; w < 10; ++w) { if (w > 0) text.append(' '); text.append(words[random.nextInt(words.length - 1)]); } doc.field("text", text.toString()); doc.save(); Set<ODocument> allDocs = new HashSet<ODocument>(); for (int i = 0; i < words.length - 1; ++i) { List<ODocument> docs = database.query(new OSQLSynchQuery<Object>("SELECT FROM Whiz WHERE text containstext \"" + words[i] + "\"")); allDocs.addAll(docs); } Assert.assertEquals(allDocs.size(), TOT + 1); doc.delete(); allDocs.clear(); for (int i = 0; i < words.length - 1; ++i) { List<ODocument> docs = database.query(new OSQLSynchQuery<Object>("SELECT FROM Whiz WHERE text containstext \"" + words[i] + "\"")); allDocs.addAll(docs); } Assert.assertEquals(allDocs.size(), TOT); } @Test(dependsOnMethods = "testFullTextInsertion") public void testUpdateDocument() { StringBuilder text = new StringBuilder(); Random random = new Random(1000); ODocument doc = new ODocument(); doc.setClassName("Whiz"); doc.field("id", 2000); doc.field("date", new Date()); for (int w = 0; w < 10; ++w) { if (w > 0) text.append(' '); text.append(words[random.nextInt(words.length - 1)]); } doc.field("text", text.toString()); doc.save(); Set<ODocument> allDocs = new HashSet<ODocument>(); for (int i = 0; i < words.length - 1; ++i) { List<ODocument> docs = database.query(new OSQLSynchQuery<Object>("SELECT FROM Whiz WHERE text containstext \"" + words[i] + "\"")); allDocs.addAll(docs); } Assert.assertEquals(allDocs.size(), TOT + 1); text.setLength(0); for (int w = 0; w < 10; ++w) { if (w > 0) text.append(' '); text.append(words[random.nextInt(words.length - 1)]); } doc.field("text", text.toString()); doc.save(); allDocs.clear(); for (int i = 0; i < words.length - 1; ++i) { List<ODocument> docs = database.query(new OSQLSynchQuery<Object>("SELECT FROM Whiz WHERE text containstext \"" + words[i] + "\"")); allDocs.addAll(docs); } Assert.assertEquals(allDocs.size(), TOT + 1); } }